Как раскрасить 2D-график в разные цвета в gnuplot

Я хочу раскрасить линию 2D-Plot. Я хочу, чтобы раскраска была функцией x. Сказать

f(x)=x^2

Я хочу создать график, в котором цвет f(x) варьируется от красного до синего, в зависимости от функции g(x), скажем

g(x)=x

Если g(x)=10, f(x) должны быть синими, if g(x)=0, f должны быть окрашены в красный цвет. Между ними мне нужен плавный переход между двумя цветами.

Будем очень признательны за любую помощь, идею или запрос, спасибо!


person no.clue    schedule 09.02.2018    source источник


Ответы (1)


При построении точек Gnuplot поддерживает параметр lc variable, который позволяет указать типы линий (и, следовательно, цвета) для отдельных точек. Однако со стилем построения lines (и цветовым градиентом вдоль отображаемой линии) скорее всего придется отвлечься на альтернативную стратегию. Например, можно разделить x-диапазон на независимые сегменты, для каждого сегмента вычислить соответствующий цвет (с точки зрения вашей функции g(x)) и, наконец, нанести f(x) на каждый из сегментов независимо:

set terminal pngcairo rounded enhanced font ",16"
set output 'test.png'
set size ratio 2/(1+sqrt(5.))

unset key

xMin = 0.0
xMax = 10.0

set xr [xMin:xMax]
set yr [0:100]

#coloring function, gMin/gMax has to be set accordingly
#so that the scaled function h(x) does not overflow the [0,1] interval
gMin = 0.
gMax = +10.
g(x) = x

#function to be plotted
f(x) = x*x

#coloring function rescaled into interval [0,1]
#for each g(x), gMin/gMax should be adjusted correspondingly
h(x) = (g(x) - gMin)/(gMax - gMin)

#generate RGB representation of the interpolated color
#corresponding to the red (gMin) -> blue (gMax) transition
color(x) = sprintf('#%02X00%02X', (1-h(x))*255, h(x)*255);

#divide the x range into N segments
N = 200
dx = (xMax - xMin)/N

set samples 1000

#make the segments overlap a bit so that we don't need too high "samples"
eps = dx/10

#plot each segment with corresponding color 
binLeftBorder(i) = xMin + i*dx
binMidPoint(i) = (binLeftBorder(i) + binLeftBorder(i+1))/2

isInBin(i, x) = (x >= (binLeftBorder(i) - eps) && x < (binLeftBorder(i+1) + eps))

plot for [i=0:N-1] isInBin(i, x)?f(x):(1/0) w l \
    lw 4 lc rgb color(binMidPoint(i))

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

person ewcz    schedule 09.02.2018
comment
Перфект, это именно то, что я пытался сделать! Как закончу, отпишусь о результатах, большое спасибо! - person no.clue; 10.02.2018