【问题标题】:gnuplot, how to label only certain points?gnuplot,如何仅标记某些点?
【发布时间】:2012-06-27 14:38:35
【问题描述】:

我正在使用以下gnuplot 命令来创建绘图:

#!/bin/bash
gnuplot << 'EOF'
set term postscript portrait color enhanced
set output 'out.ps'

plot 'data_file' u 3:2 w points , '' u 3:2:($4!=-3.60 ? $1:'aaa') w labels

EOF

data_file 看起来像这样:

  O4     -1.20     -0.33     -5.20  
O9.5     -1.10     -0.30     -3.60  
  B0     -1.08     -0.30     -3.25  
B0.5     -1.00     -0.28     -2.60  
B1.5     -0.90     -0.25     -2.10  
B2.5     -0.80     -0.22     -1.50  
  B3     -0.69     -0.20     -1.10  

我希望 gnuplot 用 1 列中的字符串标记 所有 点,除了4 等于 -3.60 的那个案例我想要aaa 字符串。我得到的是$4=-3.60 数据点被正确标记为aaa,但其余的都没有被标记为根本


更新:gnuplot 使用条件语句将 numbers 显示为标签没有问题,即:除1 之外的任何列都正确显示为每个点的标签施加的条件。也就是说,此行将列 2 (numbres) 显示为符合条件语句的点标签:

plot 'data_file' u 3:2 w points , '' u 3:2:($4!=-3.60 ? $2:'aaa') w labels

更新2:如果我将1列绘制为整体,即不使用,它也没有问题将列1绘制为点标签strong> 条件语句。也就是说,这条线正确地绘制了所有1(字符串)中的点标签:

plot 'data_file' u 3:2 w points , '' u 3:2:1 w labels

很明显,问题在于将条件语句 together 与字符串列一起使用。任何一个单独使用都很好。

【问题讨论】:

    标签: conditional gnuplot labels


    【解决方案1】:

    也许以更干净的方式,这应该有效。如果不是在字符串中打开,标签似乎无法显示计算出的数字。

    #!/bin/bash
    gnuplot << 'EOF'
    set term postscript portrait color enhanced
    set output 'out.ps'
    
    plot 'data_file' u 3:2 w points , '' u 3:2:($4!=-3.60 ? sprintf("%d",$1):'aaa') w labels
    
    EOF
    

    【讨论】:

    • 这个解决方案对我不起作用。我得到的只是一个标签('aaa'),它代表 OP 想要删除的一个标签......只有在第 1 列中的数据是整数时,sprintf("%d",$1) 才有效。做sprintf("%s",$1) 也不起作用。我在这里错过了什么吗?
    • 我没有 gnuplot 可以检查,但如果第 1 列的第一行不包含数字,可能会有所不同(在这种情况下,不需要整个 sprintf 的东西)。我承认我确实在我的数据文件上尝试过,而不是完全在 OP 上尝试过......我也会尝试 (($4!=-3.60)? ''.$1:'aaa' 仅在需要时强制字符串转换。
    • 以下工作($4 ne '-3.60' ? stringcolumn(1):'')(stringcolumn 是比使用字符串连接更好的方法),但是这个测试非常脆弱,因为它在-3.60 上进行字符串比较而不是浮点比较。 (例如 -3.6 仍然会在那里贴上标签)。这里的问题是,由于 gnuplot 正在绘制标签,因此它需要该字段中的字符串(似乎将第 4 列转换为输入字符串)。这也会在输出中留下那个(空)字符串,使其膨胀。最好的解决方案是我在下面提出的(恕我直言)——只需移动过滤器,它就可以正常工作
    • 另请注意,($4!=-3.60)? ''.$1:'aaa' 产生的结果与您的 sprintf 版本相同。
    【解决方案2】:

    这是你想要的吗?

    #!/bin/bash
    
    gnuplot << 'EOF'
    set term postscript portrait color enhanced
    set output 'out.ps'
    plot 'data_file' u 3:2 w points , \
         '' u (($4 == -3.60)? 1/0 : $3):2:1 w labels
    
    EOF
    

    我在这里所做的只是将第 4 列等于 -3.6 的 (x) 点设置为 NaN (1/0)。由于 gnuplot 忽略了这些点,生活是美好的。我认为您的脚本的问题在于您正在过滤 gnuplot 需要字符串输入的列 - 尽管我没有足够地使用它来验证这一点。我刚刚将过滤器切换到 gnuplot 需要数字(x 位置)的列,它工作得很好。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-07
      • 2014-03-22
      • 1970-01-01
      相关资源
      最近更新 更多