Gnuplot: цвета в мультиплоте непрозрачны

Я хотел бы построить положительные и отрицательные значения неэквидистантной матрицы с разными палитрами (каждая логарифмическая шкала), чтобы общий эффективный цветовой код был (-max «синий», ‹1e- 6 «белых», макс. «Красных»). Для этого необходимо использовать мультиплот для каждого графика и идеально их наложить. Теперь проблема в том, что дополнительные значения, которые должны быть "NaN", отображаются белым и непрозрачным (см. рисунок). В результате второй сюжет полностью перекрывает первый, чего не видно. Я попытался определить свою собственную цветовую палитру с помощью прозрачных цветов, но не могу заставить ее работать с командой "plot for". (Примечание: это дополнительный вопрос от здесь.)

Текущий сюжет:

CoordsX = "0.04 0.11 0.24 0.4 0.51"
CoordsY = "0.04 0.11 0.24 0.4 0.51"
dim_x = words(CoordsX)
dim_y = words(CoordsY)

dx(i) = (word(CoordsX,i)-word(CoordsX,i-1))*0.5
dy(i) = (word(CoordsY,i)-word(CoordsY,i-1))*0.5
ndx(i,j) = word(CoordsX,i) - (i-1<1     ? dx(i+1) : dx(i))
pdx(i,j) = word(CoordsX,i) + (i+1>dim_x ? dx(i)   : dx(i+1))
ndy(i,j) = word(CoordsY,j) - (j-1<1     ? dy(j+1) : dy(j))
pdy(i,j) = word(CoordsY,j) + (j+1>dim_y ? dy(j)   : dy(j+1))

set size square
set xrange[ndx(1,1):pdx(dim_x,1)]
set yrange[ndy(1,1):pdy(1,dim_y)] reverse
set tic out

set term png truecolor
set output "test.png"

set multiplot
max = 25
set cbrange [0:max]
set object rectangle from screen 0,0 to screen 1,1 behind fillcolor rgb "grey" fillstyle solid noborder # Only added to see transparency

set palette defined (0 "white", max "blue")
plot for [i=1:dim_x] file u\
(real(word(CoordsX,i))):1:(ndx(i,int($0))):(pdx(i,int($0))):(ndy(i,int($0+1))):(pdy(i,int($0+1))):(column(i)<0?abs(column(i)):NaN)\
with boxxyerror fs transparent solid 1.0 palette notitle
set palette defined (0 "white", max "red")
plot for [i=1:dim_x] file u\
(real(word(CoordsX,i))):1:(ndx(i,int($0))):(pdx(i,int($0))):(ndy(i,int($0+1))):(pdy(i,int($0+1))):(column(i)>0?abs(column(i)):NaN)\
with boxxyerror fs transparent solid 1.0 palette notitle
unset multiplot
set output

person Billy the script    schedule 25.05.2020    source источник


Ответы (1)


Несколько комментариев:

1) multiplot - неправильный механизм для создания единого сюжета. Вы получите лучшие результаты, преобразовав последовательность команд в одну plot команду. При необходимости вы можете разделить палитру на две половины: красную половину и синюю половину. Например.

set palette defined (0 "white", 1 "dark-red", 1 "white", 2 "dark blue")
set cbrange [0 : 2*max]
plot 'redstuff' using 1:...:(color) fc palette, \
     'bluestuff' using 1:...:(color+max) fc palette

2) Выбранный стиль заливки полностью непрозрачен. Если вы хотите прозрачность на 50%, она должна быть

 set style fill transparent solid 0.5

3) Непонятно, где именно появляются ваши значения NaN. Если один из компонентных прямоугольников имеет NaN в качестве координаты, он вообще не будет отображаться - так что фактически он полностью прозрачен. Однако предоставление NaN в качестве значения цвета, как правило, не обеспечивает прозрачности. В качестве особого случая стиль графика with image знает, что нужно опускать пиксели со значением NaN, но другие стили графика не имеют понятия «пиксели».

person Ethan    schedule 25.05.2020
comment
Спасибо, @Ethan, за ваш комментарий. Ваше предложение 1) кажется интересным, однако я не знаю, как согласовать его с графиком для, который необходим для неэквидистантных значений x и y. 2) не совсем то, что я хочу. Моя идея заключалась в том, чтобы иметь диапазон палитры от (0 полностью прозрачных, 1 полностью непрозрачных) с красным, например, в качестве основного цвета. К пункту 3): с изображением есть проблема в том, что он не учитывает неэквидистантные индексы матрицы. Однако это то, что мне нужно. Есть ли способ указать gnuplot отображать значения NaN как прозрачные? - person Billy the script; 25.05.2020
comment
(1) Нет проблем: plot for [i=1:FOO] "redstuff", for [i=1:BAZ] "bluestuff". (2) Палитра не имеет альфа-канала, поэтому вы не можете привязать прозрачность к значению палитры. (3) Нет, но вы можете сделать координату x или y условной для значения цвета: plot FOO using (column(color)==column(color)? $1 : NaN):2 Координата x будет взята из столбца 1, кроме случаев, когда столбец цвета имеет значение NaN. - person Ethan; 25.05.2020
comment
Ах хорошо. Что вы имеете в виду под столбцом (цвет) == столбец (цвет) или в вашем сообщении есть опечатка? Итак, я прихожу к выводу, что в gnuplot невозможно иметь два графика, каждый с логарифмической шкалой поверх друг друга !? Потому что построение графика, как вы предложили, не позволило бы использовать два разных логарифма. - person Billy the script; 25.05.2020
comment
Я просто имел в виду тот столбец, в котором хранится информация о цвете. Вы можете изменить его так, чтобы он был using 1:2:...:(log(column(color))) для шкалы журнала (не уверен, что именно вы имеете в виду под масштабом журнала в этом контексте). - person Ethan; 25.05.2020
comment
Ах хорошо. Я намеревался построить его через set logscale cb, но чтобы все диапазоны были на одном цветовом графике. (Значения варьируются от + - 1e-15 до 1e1 и, следовательно, идея разделенных положительных и отрицательных графиков, каждый с логарифмической шкалой cb. Есть ли способ добиться этого? - person Billy the script; 26.05.2020