#gnuplot
#gnuplot
Вопрос:
Извините за длинное и, вероятно, плохое название.
Я пытаюсь отобразить некоторые данные в gnuplot, где файл данных имеет формат
x y z
1.0 1.5 0.1
1.3 1.8 0.7
2.1 3.7 1.1
3.1 4.3 1.5
3.7 4.7 1.8
Я хочу построить график y против x и для каждой точки указать значение z по цвету точки. В настоящее время я использую для этого следующий код:
size = 0.5
type = 7
set term pngcairo
set output 'Foo.png'
set palette rgbformulae 22,13,-31
set cblabel "z"
unset key
set xlabel 'x'
set ylabel 'y'
set title 'y vs. x'
plot "Data.txt" u 1:2:3 w p pt type ps size palette
Это работает, но я хотел бы внести следующее изменение: для каждой точки, значение z которой ниже порога, скажем 1.0, я хочу, чтобы цвет был установлен на серый, независимо от значения z. Затем для z-значений, превышающих или равных ограничению, я хочу, чтобы цвет выбирался из палитры в соответствии с z-значением.
Таким образом, я хочу, чтобы цвет переходил от серого к синему (для текущей палитры) при значении ограничения. Можно ли это сделать, и если да, то как?
Ответ №1:
Это сложно сделать с палитрой, основанной на rgbformulae. Это относительно просто с определенной палитрой. Вот пример, который дает палитру, близкую к выбранной вами, с темно-серой разметкой в нижней части. cbrange
затем устанавливается так, чтобы ваша граница z была минимальной. Всем значениям z ниже cbmin будет присвоено значение конечной точки, которое в этом случае темно-серое.
set xrange [0:1]; set yrange [0:pi]
set sample 100; set isosample 100
set palette defined (-0.01 "grey20", 0 "blue", 0.4 "green", 0.6 "yellow", 1.0 "red")
zmin = -0.6
set cbrange [zmin: *]
set xyplane at zmin
splot cos(x)*sin(y y*(x*x)) with pm3d
Комментарии:
1. Спасибо, это очень приятно! Когда я добавляю предложенную вами палитру и соответствующий cbrange, значение серого отображается в самом низу моей цветовой шкалы справа. Вы знаете, есть ли какой-либо способ удалить это?
2. Не совсем. Возможно, вы могли бы сделать его еще более тонким фрагментом палитры. Вместо
-0.01 "grey20"
, возможно, используйте-0.001 "grey20"
. Однако я думаю, что срез, который отображается на цветовой панели, никогда не будет меньше 1/128 от общей высоты.
Ответ №2:
После gnuplot 5.4 этого можно добиться, используя функцию «палитра ()» в «использование» и комбинируя ее с «с переменной точки lc rgb».
size = 3 ### 0.5 in original code
type = 7
set term pngcairo
set output 'Foo.png'
set palette rgbformulae 22,13,-31
set cblabel "z"
unset key
set xlabel 'x'
set ylabel 'y'
set title 'y vs. x'
set cbrange [0:2] ### this is required by palette() function
gray = 0x808080 ### gray color expressed by integer
plot NaN w p palette,
"Data.txt" u 1:2:($3<1 ? gray : palette($3)) w p pt type ps size lc rgb variable
Значение RGB, передаваемое в «переменную lc rgb», определяется путем сравнения $ 3 с пороговым значением 1 (например).
«Палитра NaN w p» — это фиктивный график, метод принудительного отображения цветового поля. Без этого цветовое поле не будет отображаться.
Комментарии:
1. следует отметить, я предполагаю
palette()
, что функция существует только с gnuplot 5.4.0, а не в gnuplot 5.2.82. Спасибо за ваш ответ! Моя версия gnuplot — 5.2 (похоже, без возможности обновления), поэтому я не могу попробовать ваше решение (см. Комментарий @theozh). Поэтому я принял ответ Итана.
3. функция @theozh ‘palette (z)’, похоже, добавлена в феврале 2020 года (после 5.2.8). Я обновил ответ. Спасибо, что указали на это.
4. @AlexandreVandermonde Мне жаль слышать, что вы не можете попробовать это в данный момент. Если у вас есть возможность обновить gnuplot, вы можете сделать что-то вроде ответа. Спасибо за ваш ответ, включая объяснение.
Ответ №3:
Вот версия gnuplot 5.2. Вы можете использовать палитру rgbformulae. Он использует блок $PALETTE
данных, который создается после выполнения команды test palette
.
Код: (протестировано с gnuplot до версии 5.2.0)
### cut-off colors for a given rgbformulae palette (gnuplot >=5.2)
reset session
# create some test data
set xrange [-5:5]
set yrange [-5:5]
set samples 50
set isosamples 50
set table $Data
splot (sin(1.3*x)*cos(.9*y) cos(.8*x)*sin(1.9*y) cos(y*.2*x))*3
unset table
set palette rgbformulae 22,13,-31
test palette # necessary to put the palette into the datablock $PALETTE
myColorMin = 0
myColorMax = 6
myOutOfRangeColor = 0x808080
myColorPos(c) = int(255.0 * (c-myColorMin)/(myColorMax - myColorMin)) 1
myColor(c) = c<myColorMin || c>myColorMax ? myOutOfRangeColor :
(int(word($PALETTE[myColorPos(c)],2)*0xff)<<16)
(int(word($PALETTE[myColorPos(c)],3)*0xff)<<8)
(int(word($PALETTE[myColorPos(c)],4)*0xff))
set cbrange [myColorMin:myColorMax]
set view 36, 72
set ztics 5
splot $Data u 1:2:3:(myColor($3)) w pm3d lc rgb variable notitle
### end of code
Результат:
Комментарии:
1. Спасибо, это очень приятно! Я, вероятно, оставлю ответ Итана принятым, поскольку он был первым, и поскольку не так важно, использую ли я палитру rgbformula.