gnuplot: построение точек с цветными значениями в одном строковом столбце и отображение строки в легенде

Я хотел бы построить результаты классификации и пометить истинные классы. Итак, в основном мне нужно назначить цвет для каждой базы точек по значению в столбце строки.

dataset выглядит так:

5,1 3,5 1,4 0,2 Iris-setosa

В итоге я получил script следующее решение (благодаря ответу здесь: Как сделать точки одним цветом, когда третий столбец равен нулю, а другой цвет в противном случае - в Gnuplot?)

set palette model RGB defined (0 "red",1 "blue", 2 "green")
plot 'iris.data' using 1:2:5 notitle with points pt 2 palette

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

В настоящее время вывод выглядит следующим образом: gnuplot coloring points

Однако мне не нравится градиентная палитра, потому что в этом случае это не имеет смысла. Я бы предпочел нормальную легенду с единственным цветом и названием класса. Любая идея, как это сделать?

Ответ 1

Как вы могли бы это сделать, используя awk.

Использование файла данных Data.csv:

5.4452 4.6816 blue
1.2079 9.4082 red
7.4732 6.5507 red
2.3329 8.2996 red
3.4535 2.1937 green
1.7909 2.5173 green
2.5383 7.9700 blue

и script:

set pointsize 3
plot "< awk '{if($3 == \"red\") print}' Data.csv" u 1:2 t "red" w p pt 2, \
     "< awk '{if($3 == \"green\") print}' Data.csv" u 1:2 t "green" w p pt 2, \
     "< awk '{if($3 == \"blue\") print}' Data.csv" u 1:2 t "blue" w p pt 2

вы получите этот сюжет:

enter image description here

Что делает awk, просто проверьте третий параметр файла данных и напечатайте его только в том случае, если оно имеет какое-то значение: например, красный или синий.

Вы также избавитесь от палитры с градиентом.

script может быть дополнительно улучшена с помощью итераций gnuplot .

Ответ 2

Цветовая палитра может использоваться для получения любого точечного цвета (для отдельных точек)

plot file using 1:2:3 with points palette

Теперь настройте палитру, которая дает желаемую цветовую гамму. Вы можете настроить палитру для вычисления цвета, например, с использованием цветовой модели HSV или взглянуть на веб-сайт демонстрации gnuplot.

Просто для полноты взгляните на последний пример на демонстрационная страница gnuplot pm3d:

color bar with distinct colors in gnuplot

theta(x) = x<0 ? 0 : 1
r(x) = 4*x*(1-theta(x-0.25))
g(x) = 0.5*theta(x-0.25)*(1-theta(x-0.5))
b(x) = x
set palette model RGB functions r(gray),g(gray),b(gray)
set title "set palette model RGB functions\n4*x*(1-theta(x-0.25)), 0.5*theta(x-0.25)*(1-theta(x-0.5)), x"
splot f(x)enter code here

Ответ 3

Сопоставление строк с цветами или индексами палитры может быть сделано непосредственно в gnuplot, ключом является использование stringcolumn() и определяемой пользователем функции отображения.

Вот пример использования палитры:

#!/usr/bin/gnuplot -persist

# define a palette with an exact number of colors
set palette maxcolors 3
set palette model RGB defined ( \
  0 "red", \
  1 "blue", \
  2 "green")

# Define palette labels, the range matches the number of colors defined above
set cbrange [0:3]
set cbtics offset 0,+4 ( \
  'color1' 0, \
  'color2' 1, \
  'color3' 2, \
  '' 3)

# define a function to map strings to palette indices
map_color(string) = ( \
  string eq 'color1' ? 0 : \
  string eq 'color2' ? 1 : \
  string eq 'color3' ? 2 : \
  3)

plot '-' using 1:2:(map_color(stringcolumn(3))) notitle with points pt 2 palette
5.4452 4.6816 color1
1.2079 9.4082 color2
7.4732 6.5507 color2
2.3329 8.2996 color2
3.4535 2.1937 color3
1.7909 2.5173 color3
2.5383 7.9700 color1
EOF

enter image description here

Аналогичный подход можно использовать для непосредственного сопоставления с цветами:

#!/usr/bin/gnuplot -persist

# define a function to map strings to palette indices
map_color(string) = ( \
  string eq 'color1' ? 0xff0000 : \
  string eq 'color2' ? 0x0000ff : \
  string eq 'color3' ? 0x00ff00 : \
  0x000000)

plot '-' using 1:2:(map_color(stringcolumn(3))) notitle with points pt 2 lc rgbcolor variable
5.4452 4.6816 color1
1.2079 9.4082 color2
7.4732 6.5507 color2
2.3329 8.2996 color2
3.4535 2.1937 color3
1.7909 2.5173 color3
2.5383 7.9700 color1
EOF