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