Подтвердить что ты не робот

Gnuplot заполнен с палитрой

Я пытаюсь изменить fillstyle для опции fillcurves в gnuplot, чтобы цвет заливки представлял разницу между двумя кривыми на двумерном графике. Я думаю об этом как о расширении опции "fillcurves above/below", вместо того, чтобы иметь только два цвета, изображающие выше или ниже, есть цветовой диапазон или палитру.

Вот пример сюжета, который я хотел бы сделать из файла данных, используя вышеприведенный/приведенный ниже стиль кривой. Цветовая шкала, представляющая y-разность между двумя кривыми, будет очень полезна.

http://i.stack.imgur.com/RLlpU.png

Я попытался сделать это, добавив четвертый столбец в команду use i.e.

plot 'data.txt' using 1:2:3:($3-$2) with filledcurves fs palette

но filledcurves, похоже, не принимает четвертый столбец... Я также рассмотрел пример переменной rgb, но это тоже не работает.

4b9b3361

Ответ 1

Я играю с патчем для gnuplot, чтобы использовать linecolor rgb variable для заполненных кривых. Затем можно использовать следующий код gnuplot:

max_color=1
# for a datafile one could extract the maximum diffference with e.g.
# stats 'hotcold.dat' using 1:($3-$2)
# max_color = (abs(STATS_min_y) > abs(STATS_max_y)) ? abs(STATS_min_y) : abs(STATS_max_y)

red(val) = (val < 0 ? abs(1+val/max_color) : 1)
green(val) = (1 - abs(val)/max_color)
blue(val) = red(-val)
rgb(val) = 65536*int(255*red(val)) + 256*int(255*green(val)) + int(255*blue(val))

set yrange[0:1]
set xrange[400:2500]
set samples 200

fhot(x) = 0.1*exp(-((x-400)/200)**2) + 0.8*exp(-((x-2000)/300)**2)
fcold(x) = 0.25*exp(-((x-700)/100)**6)+ 0.4 - (2e-4*(x-2500))**2
plot '+' using 1:(fhot($1)):(fcold($1)):(rgb(fhot($1)-fcold($1))) with filledcurves lc rgb var t '',\
     '' using 1:(fhot($1)) with lines lw 4 lc rgb rgb(max_color) t 'Hot',\
     '' using 1:(fcold($1)) with lines lw 4 lc rgb rgb(-max_color) t 'Cold'

Это дает следующий результат: enter image description here

Я еще не представил патч, потому что не знаю, правильно ли понял вопрос и потому что не знаю, охватил ли я все случаи. Поэтому может потребоваться некоторая тонкая настройка.

Ответ 2

Попробуйте использовать заполненные гистограммы.

set style fill solid 1.0
plot \
 datafile u 1:2:3 lt palette w boxes,\
 datafile u 1:2:3 lt palette lw 2 w l

Столбец 3 определяет цвет заполнения цвета в соответствии с настройками палитры, столбцы 1 и 2 определяют точки данных. Вы также можете использовать фоновый цвет гистограммы для очистки деталей по графику.

Я бы хотел добавить изображение, но не могу из-за низкой репутации.

Ответ 3

Трюк состоит в том, чтобы нарисовать линии, а затем заполнить их с помощью filledcurves. Здесь, как это сделать (на основе примеров в gnuplot):

set style line 2 lc rgb 'forest-green'
set style line 3 lc rgb 'plum'
set style fill pattern 5 lc 'yellow'
set xrange [0:3000]
set yrange [0:1]
plot 'data.txt' u 1:2:3 w filledcurves notitle, \
     '' u 1:2 ls 2 with lines notitle, \
     '' u 1:3 ls 3 with lines notitle

Результат выглядит следующим образом: enter image description here

Файл данных содержит эти фиктивные значения (которые напоминают ваш второй график):

500     0.90    0.90
1000    0.90    0.75
1500    0.92    0.40
2000    0.95    0.30
2500    0.94    0.23