Groupe D'histogrammes de Gnuplot (diagramme à barres) avec une ligne par catégorie

Histogramme Cluster / Bar Chart

j'essaie de générer ce qui suit groupe d'histogrammes de ce fichier de données avec gnuplot, où catégorie est représenté dans une ligne distincte par année dans le fichier de données:

# 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 <a href=histogram cluster" src="/images/content/18332161/e133d4146137d35af4eeee59e6dd0635.png">

Mais je ne sais pas comment le faire avec une ligne par catégorie. Je serais heureux si quelqu'un a une idée comment faire cela avec gnuplot.

Histogramme Empilé Diagramme À Barres Empilées

Encore mieux serait un empilés groupe d'histogrammes comme le suivant, où le sous-catégories empilées sont représentés par séparer les colonnes dans le fichier de données:

# 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

Merci beaucoup d'avance!

16
demandé sur fiedl 2013-08-20 13:57:25

1 réponses

après quelques recherches, j'ai trouvé deux solutions différentes.

requis: fractionnement du fichier de données

les deux solutions nécessitent de diviser le fichier de données en plusieurs fichiers Classés par une colonne. Par conséquent, j'ai créé un court ruby script, qui peut être trouvé dans ce résumé:

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

Ce script est utilisé comme ceci: afin de diviser le fichier de données data.csv en data.Category1.csv et data.Category2.csv, composez le:

# 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"
...

Solution 1: Tracé En Boîtes Empilées

Stratégie: Un fichier de données par catégorie. Une colonne par pile. Les barres de l'histogramme sont tracées " manuellement "en utilisant l'argument" avec des boîtes " de gnuplot.

à L'envers: flexibilité totale en ce qui concerne les dimensions des barres, les capuchons, les couleurs, etc.

L'inconvénient: les barres doivent être placées manuellement.

# 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 (+offset):(+) title "Category 1 A" linecolor rgb "#cc0000" with boxes, \
     ''                   using (+offset):3 title "Category 2 B" linecolor rgb "#ff0000" with boxes, \
     'data.Category2.csv' using (+offset+dx):(+) title "Category 2 A" linecolor rgb "#00cc00" with boxes, \
     ''                   using (+offset+dx):3 title "Category 2 B" linecolor rgb "#00ff00" with boxes

le résultat semble comme ceci:

stacked_boxes.eps

Solution 2: Histogramme Natif De Gnuplot

Stratégie: Un fichier de données par an. Une colonne par pile. L'histogramme est produit en utilisant le mécanisme d'histogramme régulier de gnuplot.

à L'envers: plus facile à utiliser, puisque le positionnement ne se fait pas manuellement.

L'inconvénient: puisque toutes les catégories sont dans un fichier, chaque catégorie A la même couleur.

# 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"

Le résultat ressemble à ceci:

histo.eps

Références

18
répondu fiedl 2017-05-23 11:53:46