2

我有一个数据文件,其中包含一些看起来像这样的点(请注意缺少一些值):

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

但是,这会产生下图(请注意,紫色线与上图中的粉色线不同):

在此处输入图像描述

我如何才能生成一个看起来像第一张图像的图表,而不是我所拥有的?

4

1 回答 1

0

造成这种情况的原因有两个:

  1. 只要您不在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
    

    因此,您必须使用外部工具过滤数据才能正确绘制数据(另请参阅在 gnuplot 中,“缺少设置数据文件”,如何忽略“nan”和“-nan”?):

  2. 您需要计算两条曲线之间的交点以获得“紫色”线。

这是一个变体,使用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 我得到以下结果:

在此处输入图像描述

于 2013-10-25T07:18:54.207 回答