Видимый спектр с gnuplot
Поэтому у меня есть такие данные
3.500E2 -0.956862
...
10.00E2 -1.95941
В файле.
Если я построю его, то он выглядит следующим образом:
Теперь я хочу, чтобы область под кривой была заполнена видимым спектром, например:Я уже нашел этот пост на форуме, который рисует мне хороший видимый спектр, но я не могу добавить в него свою собственную кривую, так как это похоже на график pm3d.
Что я могу сделать?
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
, используя определения функций из сообщения на форуме, которое вы связали:Обратите внимание, что вам не нужно интерполировать палитру 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
Я регулярно задаю этот вопрос всякий раз, когда хочу построить спектр ВИС. Я немного доработал ответ @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
Остальная часть сюжета идентична