gnuplot改变连接线的颜色

时间:2014-02-26 10:00:51

标签: graph colors gnuplot

我正在使用gnuplot以下内容。我有n个方程式,我想根据xaxis值绘制。这是一个样本

set xrange[0:25]
f1(x) = x
f2(x) = 3*x
f3(x) = 10*x
plot (x>0)&&(x<10)?f1(x):(x<20)?f2(x):f3(x)

我知道我们可以使用下面的方法轻松设置线条的颜色。但它改变了整个颜色

set style line 1 lt 1 lw 3 pt 3 lc rgb "blue"

但我想要的是使连接线变成不同的颜色。即如果你绘制上面的图表,你将5行。 3条原始线(来自功能)和2条线(几乎垂直线)连接它们。我想改变连接线的颜色。

注1:这些功能由程序自动生成,功能数量可能很大。甚至精确的绘图命令也会自动生成

注意2:我想要一种方法来区分原始线条和连接原始线条的插值线。

感谢任何帮助

3 个答案:

答案 0 :(得分:4)

你实际拥有的是一条分段定义的线,并且没有一种简单的方法来定义gnuplot中分段线内线段的颜色。

简单方法(绘制数据文件)

我建议制作一个如下所示的数据文件:

# x y color
0   0   0
10  10  0
10  10  1
10  30  1
10  30  0
20  60  0
20  60  1
20  200 1
20  200 0
25  250 0

注意x = 10和x = 20的双点。这是线段在转换处相遇。

现在用linecolor variable

绘制它
#!/usr/bin/env gnuplot

reset

set terminal pdfcairo enhanced color dashed rounded lw 5 size 3,2 font 'Arial,14'
set output 'output2.pdf'

set style data lines
set key top left
set tics scale 0.5 out nomirror

plot 'data.dat' u 1:2:3 lc variable

看起来像这样:

enter image description here

您可以更改调色板(set palette)以确定颜色,如果需要,您可以在数据文件中包含2个以上的颜色值。

更难的方式(只适用于少数几个部分)

您可以定义2n-1个单独的行并连接它们:

#!/usr/bin/env gnuplot

reset

set terminal pdfcairo enhanced color dashed rounded lw 5 size 3,2 font 'Arial,14'
set output 'output.pdf'

set style data lines
set key top left
set tics scale 0.5 out nomirror

# points every 0.001 units in the range 0:25
set samples 25001

# main lines
f1(x) = (x <= 9.999)                   ? x    : 1/0
f3(x) = (x >= 10.001) && (x <= 19.999) ? 3*x  : 1/0
f5(x) = (x >= 20.001)                  ? 10*x : 1/0

# define slopes and y-offsets of connecting lines
m2 = (f3(10.001)-f1(9.999))/0.002
b2 = (30.0-10.0)/2.0 + 10.0
m4 = (f5(20.001)-f3(19.999))/0.002
b4 = (200.0-60.0)/2.0 + 60.0

# connecting functions
f2(x) = (x >= 9.999) && (x <= 10.001)  ? m2*(x-10) + b2 : 1/0
f4(x) = (x >= 19.999) && (x <= 20.001) ? m4*(x-20) + b4 : 1/0

plot [0:25] f1(x), f2(x), f3(x), f4(x), f5(x)

看起来像这样:

enter image description here

答案 1 :(得分:3)

您可以定义辅助功能来定义功能的断点,该功能会自动为右侧线条着色。以下代码很容易扩展到不同的函数和断点(即,您只需更改x1x2)。添加多个点也很简单。

xmin=0.
xmax=25.
x0=0.
x1=10.
x2=20.
nsample=200.


dx=(xmax-xmin)/nsample
print dx
set xrange[xmin:xmax]
set sample nsample
f1(x) = x
f2(x) = 3*x
f3(x) = 10*x
f4(x) = (x>x0)&&(x<x1)?f1(x):(x<x2)?f2(x):f3(x)
f5(x) = x
f5(x) = ( (x>x1&&x<=x1+dx) || (x>x2&&x<=x2+dx) )?1:0

set cbrange [0:1]
unset key

plot '+' using 1:(f4($1)):(f5($1)) lc variable with lines

并非我使用特殊文件名'+',它只构造具有相同空间数据点的数据文件(在nsample之后)。

Sample output

答案 2 :(得分:2)

如果可以跳过连接线,那么您可以使用@andyras第二种变体的简化版本。只需在指定范围之外定义所有函数1/0

set style data lines
unset key

f1(x) = (x > 0) && (x < 10) ? x : 1/0
f2(x) = (x > 10) && (x < 20) ? 3*x : 1/0
f3(x) = (x > 20) ? 10*x : 1/0

plot [0:25] f1(x), f2(x), f3(x)

还有另一种可能性。这假设您可以选择足够高的采样,以便连接函数的“跳转”总是大于函数内部:

set style data lines
unset key

set xrange[0:25]
f1(x) = x
f2(x) = 3*x
f3(x) = 10*x
f(x) = ( (x>0)&&(x<10)?f1(x):(x<20)?f2(x):f3(x) )

set samples 1000

curr = 0
prev = 0
lim = 1
plot '+' using (prev = curr, curr=f($1), $1):(f($1)):(abs(curr-prev) < lim ? 0 : 1) lc var

enter image description here