Graph gnuplot更改连接线的颜色

Graph gnuplot更改连接线的颜色,graph,colors,gnuplot,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) 但我想要的是使连接线的颜色不同。如果你画出上面的图表,你将画5行。3条原始线(来自函数)和2条连接它们的线(几乎垂直的线)。我想更改连接线的颜色 注1:这些函数由程序自动生成,函数

我使用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)
但我想要的是使连接线的颜色不同。如果你画出上面的图表,你将画5行。3条原始线(来自函数)和2条连接它们的线(几乎垂直的线)。我想更改连接线的颜色

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

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


非常感谢您提供的任何帮助

您实际拥有的是一条分段定义的直线,在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变量打印它:

#!/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
看起来是这样的:

# 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

您可以更改调色板(
设置调色板
)以确定颜色,如果需要,数据文件中可以有两个以上的颜色值

更难的方式(仅适用于少数路段) 您可以定义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)
#/usr/bin/env gnuplot
重置
设置终端pdfcairo增强颜色虚线圆形lw 5大小3,2字体“Arial,14”
设置输出“output.pdf”
设置样式数据行
将键设置为左上角
将tics比例设置为0.5
#在0:25范围内每0.001个单位点数
样本集25001
#主线
f1(x)=(x=10.001)和&(x=20.001)?10*x:1/0
#定义连接线的坡度和y偏移
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
#连接函数

f2(x)=(x>=9.999)&&&(x=19.999)&&&(x您可以定义一个辅助函数来定义函数的断点,该函数会自动为右侧线条着色。下面的代码很容易扩展到不同的函数和断点(即,您只需更改
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
xmin=0。
xmax=25。
x0=0。
x1=10。
x2=20。
nsample=200。
dx=(xmax xmin)/nsample
打印dx
设置xrange[xmin:xmax]
设置样本nsample
f1(x)=x
f2(x)=3*x
f3(x)=10*x

f4(x)=(x>x0)和&(x如果可以跳过连接线,则可以使用简化版本的@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)
设置样式数据行
取消设置键
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
图[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
设置样式数据行
取消设置键
设置xrange[0:25]
f1(x)=x
f2(x)=3*x
f3(x)=10*x

f(x)=(x>0)&&(X谢谢你的详细回复。函数是由一个程序生成的。它可能有大量的函数,但是构造数据文件对我来说不是一个好的选择,因为它可能会变得太大。第二个看起来更好,但是由于函数数量太多,对我来说非常困难。程序如何生成函数?可以吗它也不会为连接函数生成代码,也不会为这些方法(或Bernhard方法)生成数据文件(我可能错了,但我假设如果代码专门为gnuplot生成函数,那么您可以根据需要进行编辑)我可以编辑生成函数的代码。但是由于这些是插值线,如果可能的话,我一直在寻找gnuplot的直接方法。如果可以忽略连接线,即使是线样式或关闭这些线的功能也会起作用,这会大大简化事情……然后可以使用我的第二种方法忽略f2(x)和f4(x),或查看@Christoph的答案。需要注意的一点是使用大样本数(如我的示例中所示)如果你不想让两行之间出现水平间隙。谢谢你的详细回复。我的函数是由一个程序生成的。它可能会输出大量的函数。因此,手动添加方法中的其余函数对我来说非常困难。那么,在你的问题中,你如何在初始脚本中输出函数?这将ld没有不同。请询问您实际需要什么。这些是实际的输入。要清楚的是…我有一个程序P,它输出一组gnuplot函数(如上所述)。根据P的输入,gnuplot函数的数量(f1(x),f2(x)…fn(x))不同。我只想用连接它们的线来区分这些函数生成的线。我希望您可以清楚地输出
plot
命令(例如,我的
f4(x)
)。如果函数的数量很大,那么它将是可变的,我想您可以使用
plot
在代码中生成线条。然后您还可以轻松地生成垂直线条所描述的函数(更简单)。否则,我不明白你的意思,你在这里问的是错误的事情。@knightrider我回答了你的问题,句号。请注意人们在回答你的问题时投入的时间,并思考你的措辞。你最好通过绘制
plot来摆脱这些线条(x10&&x20?10*x:1/0
我想这就是他真正想要的needed@christoph这是一个选项。到目前为止,我发现的另一个更适合我的选项是使用
linesplot
,这样我可以看到原始行上的标记,从而可以区分原始行。