【问题标题】:Issues with entire column being zero in gnuplot histogramgnuplot 直方图中整列为零的问题
【发布时间】:2012-11-05 12:50:16
【问题描述】:

我正在使用 gnuplot 创建堆叠直方图。今天,第一次,其中一列中的所有数据点都为零。这给 gnuplot 带来了问题,正如它现在报告的那样:

直方图中的所有点未定义

这是因为我的“使用”语句具有如下逻辑:

使用 ($6>0:$6:NaN)

当整个列包含被忽略的值时,gnuplot 会阻塞。有没有我可以用来让 gnuplot 忽略这个特殊且无害的问题的设置?有时列会为零,这是数据中的有效条件。我希望 gnuplot 能够处理这个问题。

如果我无法让 gnuplot 处理它,我可能不得不使用不同的命令发出我的绘图以省略丢失的数据集。除非必须,否则我真的宁愿不进行此更改。

有人有什么建议吗?

编辑(添加绘图脚本和数据文件):

绘图脚本和数据文件是在运行时生成的,使用模板文件和脚本逻辑的组合来确定最终脚本。通过打开 gnuplot 命令的命令管道并将脚本直接提供给 gnuplot,将其直接提供给 gnuplot。

今天出现问题是因为图表中的第 6 列今天全为零。这是一件好事(没有图像处理时间超过 60 分钟)。我希望 gnuplot 简单地抑制零值(根据 plotscript 中的“绘图”行中的三元运算符),如果所有值都被抑制,那么直方图的该列没有数据。正常和预期;除了 gnuplot 不喜欢它。

剧情简介:

set terminal 'pngcairo'
set key center under horizontal font ",8"
set style data histogram
set style histogram rowstacked
set style fill  solid 1.0
set boxwidth 0.5 relative
set xtics border in scale 0.5,0.25 nomirror rotate by 45  font ",8" offset character -2, -1, 0 right
set xtics autofreq  norangelimit
set ytics border in scale 0.5,0.25 nomirror norotate  font ",8" offset character 0, 0, 0 autojustify
set ytics autofreq  norangelimit
set y2tics border in scale 0.5,0.25 nomirror norotate  font ",8" offset character 0, 0, 0 autojustify
set y2tics 1800  norangelimit
set my2tics 6
set title "Image Processing Trends"
set title  offset character 0, 0, 0 font ",18" norotate
set timestamp "" bottom offset character 0,-2,0
unset xlabel
set ylabel "Nbr of Images (bars)"
set ylabel  offset character 2, 0, 0 font ",8" textcolor lt -1 rotate by -270
set y2label "Avg Time in Seconds (line)"
set y2label  offset character 0, 0, 0 font ",8" textcolor lt -1 rotate by -270
set zero 1e-08
set label "Generated by Luna" font ",6" tc rgb "#808080" at graph 1,-0.25 right
plot 'datafile' using (sum [i=2:4] column(i)):xtic(1) title "< 15 min" lc rgb "#00FF50", '' using ($5>0?$5:NaN) title columnhead lc rgb "#F0F000", '' using ($6>0?$6:NaN) title columnhead lc rgb "#FF0000"


Datafile:
"Date" "< 5 min" "5 - 10 min" "10 - 15 min" "15 - 60 min" "> 60 min" "Avg ET"
  2012-10-26  1099    71    23     0     0   184
  2012-10-29    16     0     0     0     0    81
  2012-10-30     5     0     0     0     0    76
  2012-10-31   650    41    24    19     0   176
  2012-11-01   831   118    11     0     0   169
  2012-11-02   671   158   195    91     0   353
  2012-11-05   887   127    64    81     0   287
  2012-11-06  1343    35     8     0     0   139
  2012-11-07  1018   233   201   112     0   334
  2012-11-08  1140   433   143    16     0   271
  2012-11-09  1192   115    15     0     0   168
  2012-11-12  1008    90    17     1     0   173
  2012-11-13   911    62     5     0     0   160
  2012-11-14  1066   346   219    68     0   317
  2012-11-15   754   110     0     0     0   170

【问题讨论】:

  • 什么版本的gnuplot?您可以访问 gnuplot 4.6 吗?
  • gnuplot 4.6 补丁级别 1
  • 您能展示您使用的绘图脚本和示例数据文件吗? (如果不是太长?)。另外,如果没有可用数据,您希望 gnuplot 绘制什么?
  • plotscript 实际上是由 Perl 程序生成的,但它是使用模板和其他语句构建的。我将尝试构建脚本以编程方式提供给 gnuplot 的内容。我已将绘图脚本和数据文件添加到原始问题文本中。
  • 我为此创建了一个解决方法,但我仍然想知道是否有更好的答案。由于生成了绘图脚本,如果在该列的至少一行中检测到有效数据,我添加了逻辑以仅包含该列的“使用”部分。这似乎足以让 gnuplot 不再为此大喊大叫。我不想诉诸这种诡计,所以如果有人有更好的答案,我很想听。

标签: undefined gnuplot histogram


【解决方案1】:

我发现由于某种原因,gnuplot 对NaN1/0 的处理方式不同,数学上未定义的表达式被默默地忽略(例如,请参阅注释here)。在您的第 6 列的逻辑中使用 NaN 全为零将产生错误

 "<scriptname>", line xx: All points in histogram UNDEFINED

和一个空的 png 文件。真可惜。但是,您的逻辑中的1/0 只会产生警告

 "<scriptname>", line xx: warning: Skipping data file with no valid points

它会生成带有其余数据的图。由于它完全跳过了数据集,因此“> 60 mins”也不会出现在您可能想要的图例中。

因此,只需将 plot 命令中第 6 列(以及第 5 列,如果它充满零)的逻辑更改为

plot 'datafile' using (sum [i=2:4] column(i)):xtic(1) title "< 15 min" lc rgb "#00FF50", '' using ($5>0?$5:1/0) title columnhead lc rgb "#F0F000", '' using ($6>0?$6:1/0) title columnhead lc rgb "#FF0000"

除了警告消息通知您没有数据可以绘制超过 60 分钟(我们知道开始),这应该有效。

我使用的是 gnuplot v4.6 补丁级别 0。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-28
    • 2017-08-25
    • 2016-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多