Различных цветных полосок в гистограмме?

У меня есть очень простой набор данных:

Critical 2
High 18
Medium 5
Low 14

Создать гистограмму в gnuplot из этого набора данных легко, но все столбцы одного цвета. Я хочу, чтобы Critical был черным, высокий - красным и т. Д., Но вряд ли есть какие-либо онлайн-учебники для этого.

Может кто-то указать мне верное направление?

Ответы на вопрос(2)

Вот как вы можете сделать это, используяlinecolor variable вариант.

Если вы знаете, что строки всегда находятся в одном и том же известном порядке, вы можете использовать номер строки (нулевой столбец,$0) как индекс типа линии:

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

Если порядок может отличаться, вы можете использовать функцию индексации в стиле gnuplot, которая определяет индекс уровня предупреждения по строке со словами, разделенными пробелами:

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

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"

Это занимаетsed и тройной пробел вашего файла, чтобы gnuplot рассматривал каждую строку как отдельный набор данных (или «индекс»). Вы можете построить каждый индекс отдельно, используяindex <number> или жеi <number> для краткости, как я сделал. Также номер индекса доступен какcolumn(-2) именно так мы правильно расставляем коробки.

Возможно, чуть более чистое решение (только для gnuplot) использует фильтры:

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"

Это решение также не зависит от какого-либо конкретного порядка в вашем файле данных (вот почему я предпочитаю его немного другому решению. Мы достигаем здесь расстояния с помощьюcolumn(0) (или же$0) который представляет собой номер записи в наборе данных (в данном случае, номер строки).

Ваш ответ на вопрос