Gnuplot Histogram Cluster(gráfico de barras) con una línea por categoría
bar-chart (2)
Histograma Cluster / Bar Chart
Estoy intentando generar el siguiente grupo de histogramas fuera de este archivo de datos con gnuplot , donde cada categoría se representa en una línea separada por año en el archivo de datos:
# 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
...
Pero no sé cómo hacerlo con una línea por categoría. Me alegraría si alguien tiene una idea de cómo hacer esto con gnuplot.
Grupo de histogramas apilados / gráfico de barras apiladas
Aún mejor sería un grupo de histogramas apilados como el siguiente, donde las subcategorías apiladas están representadas por columnas separadas en el archivo de datos:
# 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
...
¡Muchas gracias por adelantado!
Después de algunas investigaciones, se me ocurrieron dos soluciones diferentes.
Requerido: dividir el archivo de datos
Ambas soluciones requieren dividir el archivo de datos en varios archivos categorizados por columna. Por lo tanto, he creado un script corto de ruby , que se puede encontrar en esta esencia:
https://gist.github.com/fiedl/6294424
Este script se usa así: Para dividir el archivo de datos data.csv
en data.Category1.csv
y data.Category2.csv
, llame a:
# 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"
...
Solución 1: Cuadro de caja apilada
Estrategia : Un archivo de datos por categoría. Una columna por pila. Las barras del histograma se trazan "manualmente" usando el argumento "con cuadros" de gnuplot.
Al revés : flexibilidad total en cuanto a tamaños de barras, gorras, colores, etc.
Desventaja : las barras deben colocarse manualmente.
# 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
El resultado se ve así:
Solución 2: Histograma de Gnuplot nativo
Estrategia : Un archivo de datos por año. Una columna por pila. El histograma se produce utilizando el mecanismo de histograma regular de gnuplot.
Al revés : más fácil de usar, ya que el posicionamiento no se debe realizar manualmente.
Desventaja : como todas las categorías están en un archivo, cada categoría tiene el mismo color.
# 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"
El resultado se ve así:
Referencias
Muchas gracias @fiedl! Según su solución n. ° 1, podría crear mi propio histograma apilado / agrupado utilizando más de dos subcategorías apiladas.
Aquí está mi código:
set terminal pngcairo transparent enhanced font "arial,10" fontscale 1.0 size 600, 400
set output ''runtimes.png''
set xtics("1" 1, "2" 2, "4" 3, "8" 4)
set yrange [0:100]
set style fill solid border -1
set key invert
set grid
num_of_ksptypes=2
set boxwidth 0.5/num_of_ksptypes
dx=0.5/num_of_ksptypes
offset=-0.12
set xlabel "threads"
set ylabel "seconds"
plot ''data1.dat'' using ($1+offset):($2+$3+$4+$5) title "SDO" linecolor rgb "#006400" with boxes, /
'''' using ($1+offset):($3+$4+$5) title "BGM" linecolor rgb "#FFFF00" with boxes, /
'''' using ($1+offset):($4+$5) title "TSQR" linecolor rgb "#FFA500 " with boxes, /
'''' using ($1+offset):5 title "SpMV" linecolor rgb "#FF0000" with boxes, /
''data2.dat'' using ($1+offset+dx):($2+$3) title "MGS" linecolor rgb "#8B008B" with boxes, /
'''' using ($1+offset+dx):3 title "SpMV" linecolor rgb "#0000FF" with boxes
data1.dat:
nr SDO BGM TSQR SpMV
1 10 15 20 25
2 10 10 10 10
3 10 10 10 10
4 10 10 10 10
data2.dat:
nr MGS SpMV
1 23 13
2 23 13
3 23 13
4 23 13
la trama resultante: