gnuplot histogram bar-chart

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: