Видимый спектр с gnuplot


Поэтому у меня есть такие данные

3.500E2 -0.956862
...
10.00E2 -1.95941

В файле.

Если я построю его, то он выглядит следующим образом:

график gnuplot с линией

Теперь я хочу, чтобы область под кривой была заполнена видимым спектром, например:

заполненная кривая с видимым спектром

Я уже нашел этот пост на форуме, который рисует мне хороший видимый спектр, но я не могу добавить в него свою собственную кривую, так как это похоже на график pm3d.

Что я могу сделать?

2 8

2 ответа:

Стиль построения filledcurves не может обрабатывать такое градиентное заполнение, но вы можете изменить файл данных, чтобы использовать его с pm3d и splot.

Стиль pm3d работает только для поверхностей, поэтому вы должны отредактировать файл данных, чтобы фактически создать сетку поверхности.

Для этого необходимо добавить в файл второй блок данных, который имеет те же значения в первом столбце и минимум всех значений второго столбца, что и его второй столбец. Оба блока должны быть разделены пустым линия.

Рассмотрим пример файла данных spectrum.dat:

350 1
400 2
450 5
500 2
550 1
600 3
650 3
700 8
750 4
800 3
850 0

Из этого вы должны получить файл

350 1
400 2
450 5
500 2
550 1
600 3
650 3
700 8
750 4
800 3
850 0

350 0
400 0
450 0
500 0
550 0
600 0
650 0
700 0
750 0
800 0
850 0

Это можно сделать на лету с помощью awk (команда стала намного лучше благодаря @TomFenech) , а затем построить график with pm3d, используя определения функций из сообщения на форуме, которое вы связали:

lmax = 780; lmin = 380
k=lmax-lmin
set cbrange [lmin:lmax]
r(x)=x<440?-(x-440)/(440-380):x<510?0:x<580?(x-510)/(580-510):x<=780?1:0
g(x)=x<440?0:x<490?(x-440)/(490-440):x<580?1:x<645?-(x-645)/(645-580):0
b(x)=x<490?1:x<510?-(x-510)/(510-490):0
f(x)=x<420?0.3+0.7*(x-380)/(420-380):x<700?1:0.3+0.7*(780-x)/(780-700)
set palette functions f(k*gray+lmin)*r(k*gray+lmin),g(k*gray+lmin),f(k*gray+lmin)*b(k*gray+lmin)

set pm3d map interpolate 0,1
set autoscale xfix
splot '<awk ''NR == FNR {min = !min || $2 < min ? $2 : min; print; next} FNR == 1 {print ""} {$2 = min}1'' spectrum.dat spectrum.dat' using 1:2:(0):1 notitle

Введите описание изображения здесь

Обратите внимание, что вам не нужно интерполировать палитру pm3d, если у вас достаточно точек данных. Это может дать вам только странные артефакты (белые вертикальные линии) в это дело.

Я регулярно задаю этот вопрос всякий раз, когда хочу построить спектр ВИС. Я немного доработал ответ @Christoph и хотел упростить цветовую часть. Что действительно возможно, используя пространство HSV вместо RGB. Кроме того, он позволяет легко вычислить дополнительный цвет для спектров поглощения.

Угол оттенка gnuplot должен быть в диапазоне 0:1, во всех других источниках 0-360. Угол 0 соответствует красному (предполагается 780 Нм). Ультрафиолетовый край находится на 300 градусах оттенка пространство.

Gnuplot автоматически масштабирует входные данные в cbrange, поэтому нам нужно поместить максимум cbrange глубоко в UV и отрезать пурпурную часть оттенка (при 300 градусах = 0,83 оттенка gnuplot). Наконец, оттенок обратно пропорционален длине волны th, поэтому функция палитры (1-серый), насыщенность и значение задаются постоянными 0,5

lmax = 780; lmin = 330
hmax=0.83
cbmax=lmax-((lmax-lmin)/hmax)

set cbrange [lmin:lmax]
h(x)=(x>hmax)?hmax:x
set palette model HSV functions h(1-gray),0.5,0.5

set pm3d map interpolate 0,1
splot '<awk ''NR == FNR {min = !min || $2 < min ? $2 : min; print; next} FNR == 1 {print ""} {$2 = min}1'' spectrum.dat spectrum.dat' using 1:2:(0):1 notitle

Остальная часть сюжета идентична