Gnuplot: цвета в мультиплоте непрозрачны - PullRequest
0 голосов
/ 25 мая 2020

Я хотел бы построить положительные и отрицательные значения неэквидистантной матрицы с разными палитрами (каждая в логарифмической шкале), так чтобы общий эффективный цветовой код был (-max «синий», < 1e-6 «белый», max «красный»). Для этого необходимо использовать мультиплот для каждого графика и идеально их наложить. Проблема теперь в том, что дополнительные значения, которые должны быть "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

1 Ответ

0 голосов
/ 25 мая 2020

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

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, но другие стили графика не имеют понятия «пиксели».

...