перевести определенную палитру в переменную rgb - PullRequest
1 голос
/ 27 мая 2020

С помощью палитры легко создавать цветовые градиенты

set view map
set samp 50,50

set palette defined (0 "blue", 1 "green", 2 "red")
spl "++" us 1:2:1 palette pt 5

Теперь я хотел бы применить прозрачность в вертикальном направлении. Опция lc rbg variable поддерживает прозрачность через альфа-канал (см. Также здесь ):

spl "++" us 1:2:1:(int(($2+5)/10*255)<<24) lc rgb var pt 5

Но как я могу перевести palette цвета в rgb цветов?

Второй вопрос: почему я получаю только 10 горизонтальных строк, хотя я указал 50 в samp?

Ответы [ 2 ]

3 голосов
/ 27 мая 2020

Сначала простой ответ: при двумерной выборке, автоматически из splot или явно из plot '++', количество выборок в первом измерении контролируется set sample, а количество выборок во втором. размер контролируется set isosample.

Теперь посложнее. В версиях gnuplot до текущей версии 5.2.8 вы не можете добавить прозрачность непосредственно в палитру. Однако вы можете выполнить go с помощью многоэтапного процесса сохранения палитры в файл или блок данных, а затем считывать ее обратно как массив цветов RGB. Когда у вас есть этот массив, вы можете добавить значение альфа-канала, чтобы он также выражал прозрачность. Я покажу этот процесс, используя блок данных, созданный командой test palette. В более старых версиях gnuplot вам, возможно, придется вместо этого использовать файл, созданный set print "palette.save"; show palette palette 256;.

# save current palette to a datablock as a list of 256 RGB colors, one per line
set palette defined (0 "blue", 1 "green", 2 "red")
test palette
# print one line to show the format (cbval R G B NTSCval)
print $PALETTE[4]
# Create an array of packed RGB values
array RGB[256]
do for [i=1:256] {
    Red = int(255. * word($PALETTE[i],2))
    Green = int(255. * word($PALETTE[i],3))
    Blue = int(255. * word($PALETTE[i],4))
    RGB[i] = Red << 16 | Green << 8 | Blue
}

# Sample from '++' are generated to span ranges on the u and v axes
# I choose 1:256 so that the y coordinates match the range of array indices
set sample 50
set isosample 50
set urange [1:256]
set vrange [1:256]
set xrange [*:*] noextend
set yrange [*:*] noextend

# Now you can use colors stored in the array via colorspec `rgb variable`
# which will also accept an alpha channel in the high bits
plot "++" using 1:2:(RGB[int($2)]) with points pt 5 lc rgb variable

# The final step is to add an alpha channel as a function of y
# Here I go from opaque (Alpha = 0) to 50% transparent (Alpha = 127)
# This works because I know y will run from 1-256 
ARGB(y) = RGB[int(y)] + (int(y/2)<<24)
plot "++" using 1:2:(ARGB($2)) with points pt 5 lc rgb variable

Результат, показанный ниже. enter image description here

Требуемая последовательность команд, как видите, беспорядочная. В следующем выпуске gnuplot (5.4) это будет намного проще. В новой версии будет палитра функций (z), которая преобразует текущую палитру непосредственно в упакованное значение RGB. Обратите внимание, что функции palette () нет в тестовой версии -rc1, но она будет в -rc2. Таким образом, в версии 5.4 все манипуляции с палитрой / массивом / RGB можно заменить на

  plot '++' using 1:2:(palette($2) + (int($2)<<24)) with points pt 5 lc rgb variable
3 голосов
/ 27 мая 2020

Проверьте также это: Gnuplot: прозрачность точек данных при использовании палитры

Прежде всего, вы можете проверить, что делает ваша определенная палитра:

set palette defined (0 "blue", 1 "green", 2 "red")
test palette

Вы получите следующее:

enter image description here

Каждый канал (R, G, B) имеет функцию с диапазоном ввода [0: 1] и выходной диапазон [0: 1]. В данном случае это линейный градиент.

Итак, вы должны определить такую ​​функцию и соединить каналы вместе с каналом прозрачности (альфа), используя битовый сдвиг (см. help operators binary).

Самое приятное в палитре то, что gnuplot заботится о диапазоне. Здесь вы должны знать минимум и максимум заранее и соответственно масштабировать цвет. Для этого можно использовать stats.

Код:

### your own palette with transparency
reset session

r(x) = x < 0.5 ? 0 : 2*x -1
g(x) = x < 0.5 ? 2*x : 2-2*x
b(x) = x < 0.5 ? 1-2*x : 0
a(y) = y

myColor(x,y) = (int(a((y-yMin)/(yMax-yMin))*0xff)<<24) + \
               (int(r((x-xMin)/(xMax-xMin))*0xff)<<16) + \
               (int(g((x-xMin)/(xMax-xMin))*0xff)<<8) + \
                int(b((x-xMin)/(xMax-xMin))*0xff)

set samples 50
set isosamples 50
set size square

xMin=-5; xMax=5
yMin=-5; yMax=5

plot '++' u 1:2::(myColor($1,$2)) w p pt 5 ps 0.5 lc rgb var notitle

### end of code

Результат:

enter image description here

...