Гистограмма Gnuplot (диаграмма гистограммы) с одной линией для каждой категории

Таблица гистограмм/диаграмма диаграммы

Я пытаюсь создать следующий гистограммный кластер из этого файла данных с gnuplot, где представлена ​​ категория в отдельной строке в год в файле данных:

# datafile
year   category        num_of_events
2011   "Category 1"    213
2011   "Category 2"    240
2011   "Category 3"    220
2012   "Category 1"    222
2012   "Category 2"    238
...

desired histogram cluster

Но я не знаю, как это сделать с помощью одной строки для каждой категории. Я был бы рад, если бы кто-нибудь понял, как это сделать с помощью gnuplot.

Сложенная таблица гистограмм/таблица с разбивкой по листам

Еще лучше будет кластер гистограмм stacked, как показано ниже, где сложенные подкатегории представлены отдельными столбцами в файле данных:

# datafile
year   category        num_of_events_for_A    num_of_events_for_B
2011   "Category 1"    213                    30
2011   "Category 2"    240                    28
2011   "Category 3"    220                    25
2012   "Category 1"    222                    13
2012   "Category 2"    238                    42
...

desired stacked histogram cluster

Большое спасибо!

Ответы

Ответ 1

После некоторых исследований я придумал два разных решения.

Обязательный параметр: разделение файла данных

Оба решения требуют разбиения файла данных на несколько файлов, разделенных по столбцу. Поэтому я создал короткий ruby script, который можно найти в этом значении:

https://gist.github.com/fiedl/6294424

Этот script используется следующим образом: Чтобы разделить файл данных data.csv на data.Category1.csv и data.Category2.csv, вызовите:

# bash
ruby categorize_csv.rb --column 2 data.csv

# data.csv
# year   category   num_of_events_for_A   num_of_events_for_B
"2011";"Category1";"213";"30"
"2011";"Category2";"240";"28"
"2012";"Category1";"222";"13"
"2012";"Category2";"238";"42"
...

# data.Category1.csv
# year   category   num_of_events_for_A   num_of_events_for_B
"2011";"Category1";"213";"30"
"2012";"Category1";"222";"13"
...

# data.Category2.csv
# year   category   num_of_events_for_A   num_of_events_for_B
"2011";"Category2";"240";"28"
"2012";"Category2";"238";"42"
...

Решение 1: График сложенной коробки

Стратегия. Один файл данных для каждой категории. Один столбец на стек. Строки гистограммы отображаются "вручную", используя аргумент "с полями" gnuplot.

Поверхность: полная гибкость в отношении размеров, крышек, цветов и т.д.

Даунсайд. Бары должны быть размещены вручную.

# solution1.gnuplot
reset
set terminal postscript eps enhanced 14

set datafile separator ";"

set output 'stacked_boxes.eps'

set auto x
set yrange [0:300]
set xtics 1

set style fill solid border -1

num_of_categories=2
set boxwidth 0.3/num_of_categories
dx=0.5/num_of_categories
offset=-0.1

plot 'data.Category1.csv' using ($1+offset):($3+$4) title "Category 1 A" linecolor rgb "#cc0000" with boxes, \
     ''                   using ($1+offset):3 title "Category 2 B" linecolor rgb "#ff0000" with boxes, \
     'data.Category2.csv' using ($1+offset+dx):($3+$4) title "Category 2 A" linecolor rgb "#00cc00" with boxes, \
     ''                   using ($1+offset+dx):3 title "Category 2 B" linecolor rgb "#00ff00" with boxes

Результат выглядит следующим образом:

stacked_boxes.eps

Решение 2: Гистограмма родного гистограммы

Стратегия. Один файл данных в год. Один столбец на стек. Гистограмма создается с использованием обычного гистограммного механизма gnuplot.

Поверхность: проще в использовании, так как позиционирование не должно выполняться вручную.

Даунсайд. Поскольку все категории находятся в одном файле, каждая категория имеет один и тот же цвет.

# solution2.gnuplot
reset
set terminal postscript eps enhanced 14

set datafile separator ";"

set output 'histo.eps'
set yrange [0:300]

set style data histogram
set style histogram rowstack gap 1
set style fill solid border -1
set boxwidth 0.5 relative

plot newhistogram "2011", \
       'data.2011.csv' using 3:xticlabels(2) title "A" linecolor rgb "red", \
       ''              using 4:xticlabels(2) title "B" linecolor rgb "green", \
     newhistogram "2012", \
       'data.2012.csv' using 3:xticlabels(2) title "" linecolor rgb "red", \
       ''              using 4:xticlabels(2) title "" linecolor rgb "green", \
     newhistogram "2013", \
       'data.2013.csv' using 3:xticlabels(2) title "" linecolor rgb "red", \
       ''              using 4:xticlabels(2) title "" linecolor rgb "green"

Результат выглядит следующим образом:

histo.eps

Ссылки