Установите серый цвет для точек ниже некоторой границы при построении с палитрой в Gnuplot

#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.8

2. Спасибо за ваш ответ! Моя версия 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.