гистограмма автоматического стека gnuplot

#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. вам нужен список уникальных элементов столбца 1. Здесь это будет в порядке первых событий.
  2. во время построения графиков в циклах вы добавляете свои вклады в зависимости от функции «фильтр» myAdd() .
  3. вы меняете цвет, когда сложение равно нулю ( dy=0 ).
  4. вы добавляете метки аналогичным образом со смещением

Этот код, вероятно, можно упростить, но он может послужить отправной точкой.

Код:

 ### "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 = принять и/или проголосовать.