2012-06-18 30 views
6

Tengo un conjunto de datos muy simple:barras de diferentes colores en gnuplot gráfico de barras?

Critical 2 
High 18 
Medium 5 
Low 14 

Creación de un gráfico de barras en gnuplot fuera de este conjunto de datos es fácil, pero todos los bares son del mismo color. Quiero tenerlo para que Critical sea negro, high sea rojo, etc., pero parece que apenas hay tutoriales en línea para hacer esto.

¿Alguien puede indicarme la dirección correcta?

Respuesta

5
set xrange [-.5:3.5] 
set yrange [0:] 
set style fill solid 
plot "<sed 'G;G' test.dat" i 0 u (column(-2)):2:xtic(1) w boxes ti "Critical" lc rgb "black",\ 
    "<sed 'G;G' test.dat" i 1 u (column(-2)):2:xtic(1) w boxes ti "High" lc rgb "red" ,\ 
    "<sed 'G;G' test.dat" i 2 u (column(-2)):2:xtic(1) w boxes ti "Medium" lc rgb "green",\ 
    "<sed 'G;G' test.dat" i 3 u (column(-2)):2:xtic(1) w boxes ti "Low" lc rgb "blue" 

Esto toma sed y triples espacios de su archivo para que gnuplot ve cada línea como un conjunto de datos diferente (o "índice"). Puede trazar cada índice por separado usando index <number> o i <number> para abreviar como lo he hecho. Además, el número de índice está disponible como column(-2), que es la forma en que obtenemos las casillas espaciadas correctamente.

Posiblemente un (sólo gnuplot) solución ligeramente más limpia está utilizando filtros:

set xrange [-.5:3.5] 
set yrange [0:] 
set style fill solid 
CRITROW(x,y)=(x eq "Critical") ? y:1/0 
HIGHROW(x,y)=(x eq "High") ? y:1/0 
MIDROW(x,y) =(x eq "Medium") ? y:1/0 
LOWROW(x,y) =(x eq "Low") ? y:1/0 
plot 'test.dat' u ($0):(CRITROW(stringcolumn(1),$2)):xtic(1) w boxes lc rgb "black" ti "Critical" ,\ 
    '' u ($0):(HIGHROW(stringcolumn(1),$2)):xtic(1) w boxes lc rgb "red" ti "High" ,\ 
    '' u ($0):(MIDROW(stringcolumn(1),$2)):xtic(1) w boxes lc rgb "green" ti "Medium" ,\ 
    '' u ($0):(LOWROW(stringcolumn(1),$2)):xtic(1) w boxes lc rgb "blue" ti "Low" 

Esta solución también no depende de ningún orden particular en su archivo de datos (que es por eso que prefiero un poco hacia la otra solución. Llevamos a cabo la separación aquí con column(0) (o $0) que es el número de registro en el conjunto de datos (en este caso, el número de línea).

2

aquí es cómo se puede hacer esto utilizando la opción linecolor variable.

Si usted sabe, que las líneas están siempre en el mismo orden, conocida, puede utilizar el número de fila (columna cero, $0) como el índice de tipo de línea:

set style fill solid noborder 
set linetype 1 lc rgb 'black' 
set linetype 2 lc rgb 'red' 
set linetype 3 lc rgb 'yellow' 
set linetype 4 lc rgb 'green' 

set yrange [0:*] 
unset key 
plot 'alerts.txt' using 0:2:($0+1):xtic(1) with boxes linecolor variable 

Si el orden puede variar, puede utilizar una función de indexación de estilo gnuplot, que determina el índice del nivel de aviso a partir de una cadena con palabras separados por espacios:

alerts = 'Critical High Medium Low' 
index(s) = words(substr(alerts, 0, strstrt(alerts, s)-1)) + 1 

set style fill solid noborder 
set linetype 1 lc rgb 'black' 
set linetype 2 lc rgb 'red' 
set linetype 3 lc rgb 'yellow' 
set linetype 4 lc rgb 'green' 

set yrange [0:*] 
unset key 
plot 'alerts.txt' using 0:2:(index(strcol(1))):xtic(1) with boxes linecolor variable 

enter image description here

Cuestiones relacionadas