2012-06-18 12 views
6

Mam bardzo prosty zestaw danych:Różne kolorowe paski na wykresie słupkowym gnuplot?

Critical 2 
High 18 
Medium 5 
Low 14 

Tworzenie wykres słupkowy w gnuplot z tego zestawu danych jest łatwe, ale wszystkie bary są tego samego koloru. Chcę mieć to tak, że Critical jest czarny, high is red, itp., Ale wydaje się, że nie ma prawie żadnych tutoriali online do robienia tego.

Czy ktoś może wskazać mi właściwy kierunek?

Odpowiedz

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" 

Dzieje sed i potrójne obowiązuje plik tak, że gnuplot widzi każdy wiersz jako innego zestawu danych (lub „index”). Możesz wykreślić każdy indeks osobno, używając index <number> lub i <number> krótko, jak to zrobiłem. Ponadto numer indeksu jest dostępny pod numerem column(-2), dzięki czemu otrzymujemy odpowiednio rozmieszczone pola.

Być może nieco bardziej czyste (tylko gnuplot) rozwiązaniem jest użycie filtrów:

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" 

To rozwiązanie również nie zależy od konkretnego zamawiającego w Twoim pliku danych (dlatego wolę go lekko do drugiej rozwiązaniem. Realizujemy odstępy tutaj z column(0) (lub $0), który to numer rekordu w zbiorze danych (w tym przypadku liczba linii).

2

Oto w jaki sposób można to zrobić za pomocą opcji linecolor variable.

Jeśli wiesz, że linie są zawsze w tym samym, znanym celu, można użyć numeru wiersza (zerowego kolumny, $0) jako wskaźnik rodzaju linii:

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 

Jeśli zamówienie mogą się różnić, można użyć funkcją indeksowania gnuplot stylu, który określa indeks poziomu ostrzegawczego z ciągiem z oddzielonych spacjami wyrazów:

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

Powiązane problemy