绘制最多两个图

时间:2013-10-25 05:26:05

标签: max gnuplot

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

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

我想将这些数据绘制成一个如下图所示(注意粉红线是其他两条线的最大值):

enter image description here

为了做到这一点,我有以下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

然而,这会生成以下图表(请注意,紫色线不会像前一个图像中的粉色线那样):

enter image description here

我怎样才能制作出看起来像第一张图片的图表,而不是我的图片?

1 个答案:

答案 0 :(得分: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
    

    因此,您必须使用外部工具过滤数据才能正确绘制数据(另请参阅In gnuplot, with “set datafile missing”, how to ignore both “nan” and “-nan”?):

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

  3. 以下是使用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我得到以下结果:

    enter image description here