2012-06-18 36 views
6

Tôi có một tập dữ liệu rất đơn giản:Các thanh màu khác nhau trong biểu đồ thanh gnuplot?

Critical 2 
High 18 
Medium 5 
Low 14 

Tạo một biểu đồ thanh trong gnuplot ra khỏi bộ dữ liệu này là dễ dàng, nhưng tất cả các quán bar là cùng một màu sắc. Tôi muốn có nó để Critical là màu đen, cao là màu đỏ, vv, nhưng có vẻ hầu như không có bất kỳ hướng dẫn trực tuyến để làm điều này.

Có ai có thể chỉ cho tôi đúng hướng không?

Trả lời

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" 

Điều này cần sed và tăng gấp ba không gian tệp của bạn để gnuplot thấy mỗi dòng dưới dạng tập dữ liệu khác (hoặc "chỉ mục"). Bạn có thể vẽ riêng từng chỉ mục bằng cách sử dụng index <number> hoặc i <number> cho ngắn như tôi đã làm. Ngoài ra, số chỉ mục có sẵn là column(-2) là cách chúng tôi nhận được các ô được đặt cách nhau đúng cách.

Có thể một hơi sạch hơn (gnuplot chỉ) giải pháp là sử dụng bộ lọc:

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" 

Giải pháp này cũng không phụ thuộc vào bất kỳ đặt hàng đặc biệt trong datafile của bạn (đó là lý do tôi thích nó một chút để người kia giải pháp. Chúng tôi thực hiện khoảng cách ở đây với column(0) (hoặc $0) đó là con số kỷ lục trong tập dữ liệu (trong trường hợp này, số dòng).

2

đây là cách bạn có thể làm điều này bằng cách sử dụng tùy chọn linecolor variable.

Nếu bạn đã biết, rằng các đường luôn trong cùng một trật tự, được gọi, bạn có thể sử dụng số hàng (cột 0, $0) như chỉ số linetype:

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 

Nếu thứ tự có thể thay đổi, bạn có thể sử dụng một chức năng lập chỉ mục gnuplot-phong cách, trong đó xác định các chỉ số về mức độ cảnh báo từ một chuỗi với các từ không gian tách biệt:

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

Các vấn đề liên quan