我有一个数据文件,其中包含一些看起来像这样的点(注意缺少一些值):
x A 1-A
0 1 0
0.25 0 1
0.5
0.75 0 1
1 1 0
1.25 0 1
1.5
1.75 0 1
2 1 0
2.25 0 1
2.5
2.75 0 1
3 1 0
3.25 0 1
3.5
3.75 0 1
4 1 0
4.25 0 1
5
我想将这些数据绘制成一个如下图所示(注意粉红线是其他两条线的最大值):
为了做到这一点,我有以下gnuplot代码,除了粉红色系之外的所有代码都适用:
gnuplot> max(x,y) = (x>y) ? x : y
gnuplot> plot "dataset1" using 1:2 title "A" with lines lc rgbcolor "black" lw 4, \
>"dataset1" using 1:3 title "1-A" with lines lc rgbcolor "blue" lw 4, \
>"dataset1" using 1:(max($2,$3)) title "Fuzzy(A)" with lines lc rgbcolor "purple" lw 4
然而,这会生成以下图表(请注意,紫色线不会像前一个图像中的粉色线那样):
我怎样才能制作出看起来像第一张图片的图表,而不是我的图片?
答案 0 :(得分:0)
这有两个原因:
只要您不在using
语句中进行计算,空的“字段”就会被视为缺失数据。如果你有两个点之间有“缺失”点,它们仍然用一条线连接。如果两者之间的点未定义(因为它在您计算时变为),则其他两个点未连接。最简单的案例是:
set yrange[-0.1:1.1]
set multiplot layout 2,1
plot 'dataset1' using 1:2 with lines
plot 'dataset1' using 1:($2) with lines
unset multiplot
因此,您必须使用外部工具过滤数据才能正确绘制数据(另请参阅In gnuplot, with “set datafile missing”, how to ignore both “nan” and “-nan”?):
您需要计算两条曲线之间的交点,以获得“紫色”线。
以下是使用awk
的变体,它同时执行过滤(仅使用具有三个字段的行(if (NF == 3)
并跳过描述的第一行),并计算交叉点并添加它们到输出:
max(x,y) = (x>y) ? x : y
plot "dataset1" using 1:2 title "A" with lines lc rgbcolor "black" lt -1 lw 4, \
"dataset1" using 1:3 title "1-A" with lines lc rgbcolor "blue" lt -1 lw 4, \
"< awk 'BEGIN { prevX = prevA = prevN = currX = currA = currN = -1 } \
{ if (NF == 3 && NR > 1) { \
if (currA != -1) { prevA = currA; prevN = currN; prevX = currX } \
currX = $1; currA = $2; currN = $3; \
if ((prevA != -1) && (prevA != currA)) { \
print 0.5*(currX + prevX), 0.5*(currA+prevA), 0.5*(currN+prevN); \
}\
print \
}\
}' dataset1" \
using 1:(max($2,$3)) title "Fuzzy(A)" with lines lc rgbcolor "purple" lt 2 lw 4
使用其他一些小设置
set termoption dashed
set key above right
set autoscale fix
set offset 0,0,0.1,0
和4.6.4我得到以下结果: