【问题标题】:gnuplot computing stats over multiple columnsgnuplot 计算多列的统计信息
【发布时间】:2015-11-16 08:04:07
【问题描述】:

我有一个简单的 9 列文件。我不想为每一列计算某些统计数据然后绘制它(使用 gnuplot)。

1)这就是我计算除第一列之外的每一列的统计信息的方式。

stats 'data' every ::2 name "stats"

2) 在输出画面中可以看到操作成功。请注意,列数/记录数为 8

* FILE: 
  Records:      8
  Out of range: 0
  Invalid:      0
  Blank:        0
  Data Blocks:  1

* COLUMNS:
  Mean:          6.5000       491742.6625
  Std Dev:       2.2913          703.4865
  Sum:          52.0000       3.93394e+06
  Sum Sq.:     380.0000       1.93449e+12

  Minimum:       3.0000 [0]   490312.0000 [2]
  Maximum:      10.0000 [7]   492643.5000 [7]
  Quartile:      4.5000       491329.5000
  Median:        6.5000       491911.1500
  Quartile:      8.5000       492252.2500

  Linear Model: y = 121.8 x + 4.91e+05
  Correlation:  r = 0.3966
  Sum xy:       2.558e+07

3)现在我可以通过像这样附加 _x 和 _y 来访问前 2 列的统计信息

print stats_median_x
print stats_median_y

我的问题是:

  • 如何访问剩余 6 列的统计信息(比如说中位数)?
  • 我怎样才能在所有中位数上绘制一条线,并针对某个 X 轴绘制一条线?

我知道我可以简单地添加一个 python 脚本来预先计算所有这些,但如果有一种使用 gnuplot 本身的简单方法来完成它,我宁愿避免它。

谢谢!

【问题讨论】:

    标签: plot gnuplot


    【解决方案1】:

    简答题

    • “如何访问另一列的统计信息?”
      使用stats 'data'using n,您将访问第 nth 列...
    • “我如何绘制所有中位数?”
      例如set print 和 do for 循环可以创建可用于绘图的数据文件。

    可行的解决方案

        set print "StatDat.dat" 
        do for [i=2:9] { # Here you will use i for the column.
          stats  'data.dat' u i nooutput ; 
          print i, STATS_median, STATS_mean , STATS_stddev # ...
        } 
        set print
        plot "StatDat.dat" us 1:2 # or whatever column you want...
    

    多说几句
    通过help stats 向 gnuplot 本身寻求帮助,:-) 可以阅读很多有趣的东西。

    语法:
    stats 'filename' [使用 N[:M]] [name 'prefix'] [[no]output]]
    此命令准备文件的一列或两列中数据的统计摘要。 使用说明符的解释方式与绘图命令相同。参见plot有关index、every 和using 指令的详细信息。

    • 从第一个突出显示的句子我们可以理解,它每次为一列或最多两列准备统计信息(遗憾的是让我们以后再看......)。
    • 从第二个突出显示的句子可以看出,它将遵循 plot 命令的相同语法:
      所以stats 'data'using 3会给你x中第三列的统计数据
      和stats 'data' using 4:5x,y中的第4和第5个...

    关于您的解释的说明

    1. 你说

      这就是我计算除第一列之外的每一列的统计信息的方式。
      stats 'data' every ::2 name "stats"

      这并不是前两列的统计数据不包括前两行,实际上它们的计数器是从 0 开始而不是从 1 开始的。

    2. 由于上述假设/解释,当我们阅读时

      记录:8

      表示计算出的行数为 8;您的文件有 10 行(可用)行,您指定 every ::2 并跳过前两行,因此您有 8 条记录对统计有用。
      确实,所以我们可以更好地理解 help stats 中的说法

      STATS_records           # total number of in-range data records
      

      暗示“用于计算这个统计量”。

    在 gnuplot 4.6 补丁级别 4 上测试
    使用 gnuplot 5.0 补丁级别 1

    【讨论】:

    • 谢谢!我错误地假设“stats”能够在一次调用中处理文件中的所有列。解决方法很有帮助!
    • 不客气。它应该是有用的,但似乎仍然不是这样。顺便说一句,如果您的文件超过 10 行(可能会发生我们从 10 行开始,我们以 100 万行结束)您可能希望每次通过使用两列将执行时间减半并打印 x和 y 在随后的两行......在这个例子中,我更喜欢保持更多平面。使用另一个技巧,您可以避免将统计数据转储到临时文件中......但为了保持理智,最好保持简单,特别是如果您将在一段时间后重用代码。内存是有限的,至少我的:-)
    • @starfry ...但这是另一个问题! ;-) 由于您在 Linux 类 环境中工作,您可以在 do 循环中使用 firstrow = system('head -1 '.data) 然后使用 print word(firstrow, i), STATS_median, STATS_mean , STATS_stddev # ......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-14
    • 1970-01-01
    • 2014-04-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多