#gnuplot
Вопрос:
Вот мой набор данных:
type size name
label_0 1 nameOfData_0
label_0 2 nameOfData_1
label_0 3 nameOfData_2
label_1 2 nameOfData_3
label_2 1 nameOfData_4
label_0 2 nameOfData_5
label_1 3 nameOfData_6
label_3 2 nameOfData_7
label_3 1 nameOfData_8
Я бы хотел, чтобы сюжет выглядел так:
Я бы хотел, чтобы каждая метка была стеком, и каждое имя data_x помещалось в правильный стек в соответствии с его размером. Если возможно, добавьте также легенду для каждого элемента стека.
Я знаю, что мог бы переформатировать данные, чтобы легко обработать их с помощью gnuplot, но я не хочу этого делать.
Есть идеи о том, как я мог бы отобразить этот график с помощью gnuplot?
Спасибо за вашу помощь!
Ответ №1:
Возможно, есть способ добиться этого с помощью встроенного в gnuplot стиля гистограммы с накоплением, проверьте help histograms
. Следующее решение не слишком очевидно, но, похоже, дает желаемый результат и использует стиль построения with boxxyerror
(проверка help boxxyerror
).
- вам нужен список уникальных элементов столбца 1. Здесь это будет в порядке первых событий.
- во время построения графиков в циклах вы добавляете свои вклады в зависимости от функции «фильтр»
myAdd()
. - вы меняете цвет, когда сложение равно нулю (
dy=0
). - вы добавляете метки аналогичным образом со смещением
Этот код, вероятно, можно упростить, но он может послужить отправной точкой.
Код:
### "manual" stacked histogram
reset session
$Data <<EOD
type size name
label_0 1 nameOfData_0
label_0 2 nameOfData_1
label_0 3 nameOfData_2
label_1 2 nameOfData_3
label_2 1 nameOfData_4
label_0 2 nameOfData_5
label_1 3 nameOfData_6
label_3 2 nameOfData_7
label_3 1 nameOfData_8
EOD
# get a unique list from datablock column 1
set table $Dummy
Headers = 1
addToList(list,col) = list.( strstrt(list,'"'.strcol(col).'"') > 0 ? '' :
' "'.strcol(col).'"')
plot Uniques='' $Data u (Uniques=addToList(Uniques,1),'') skip Headers w table
unset table
N = words(Uniques)
Unique(i) = word(Uniques,i)
set xrange [1:N]
set xtics out noenhanced
set grid x,y
set offsets 0.5,0.5,0.5,0
unset key
set style fill transparent solid 0.7 border
myBoxWidth = 0.8
myAdd(colD,colF,i) = strcol(colF) eq Unique(i) ? column(colD) : 0
myLabel(col1,col2) = dy==0 ? '' : sprintf("%sn%g",strcol(col1),column(col2))
plot for [i=1:N] y=y0=(c=1,0) $Data u (i):(dy=myAdd(2,1,i), y=y dy,(y0 y)/2.):
(myBoxWidth/2.):(y0=y,dy/2.):(dy==0?c:c=c 1) skip Headers w boxxy lc variable,
for [i=1:N] y=y0=0 $Data u (i):(dy=myAdd(2,1,i), y=y dy,(y0 y)/2.):
(y0=y,myLabel(3,2)):xtic(Unique(i)) skip Headers w labels offset 0,0.5 noenhanced
### end of code
Результат:
Комментарии:
1. Потрясающе! Большое спасибо, именно то, что я искал!
2. Рад, что смог помочь. Спасибо за StackOverflow = принять и/или проголосовать.