我正在使用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:我想要一种方法来区分原始线条和连接原始线条的插值线。
感谢任何帮助
答案 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
看起来像这样:
您可以更改调色板(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)
看起来像这样:
答案 1 :(得分:3)
您可以定义辅助功能来定义功能的断点,该功能会自动为右侧线条着色。以下代码很容易扩展到不同的函数和断点(即,您只需更改x1
或x2
)。添加多个点也很简单。
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
之后)。
答案 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