【问题标题】:GNUPLOT - How can I show max values in the legendGNUPLOT - 如何在图例中显示最大值
【发布时间】:2017-04-13 12:07:34
【问题描述】:

我正在用 GNUPlot 绘制图形。我能够生成带有图例的堆叠直方图,但我正在努力用每个项目的 MIX、MAX 等值来扩展图例,就像我设法使用 RRDTool 得到的一样

我的数据看起来像这样

DATE         2GRAN   3GRAN   4GRAN   2GTRAN 
20170401     1234    1232    5454    98765
20170402     2312    99999   11      1234
20170403     55      654     1123    10000

但有更多的列。

我使用的代码是:

clear
reset
set key out
set terminal jpeg size 1900,1080 font "Helvetica" 16
set output 'plot_per_mo.jpg'
set xtics rotate out
set style data histogram
set style histogram rowstacked
set boxwidth 0.7 relative
set datafile missing '?'
set datafile separator '\t'


do for [i=2:13]{
    stats 'convertedDataMO.dat' using (column(i))
    max(i) = STATS_max
    print sprintf("Max[%2d] = %d",i,max(i))
    }
set palette defined ( 0 "black", 1 "yellow",  2 "green", 3 "blue", 4 "red", 5 "orange" )

plot for [COL=2:13] 'convertedDataMO.dat' using COL:xticlabels(1) lt palette frac COL/13. title columnheader(COL)

我尝试使用

plot for [COL=2:13] 'convertedDataMO.dat' using COL:xticlabels(1) lt palette frac COL/13. title sprintf("%20s ---> %6d",columnheader(COL),max(COL))

但我有两个问题。

  1. columnheader 未被识别为字符串
  2. max(COL) 只显示最后一个值(在从 sprintf 中删除 columnheader 后测试)

我是 gnuplot 的新手,所以我确定我在这里遗漏了一些重要的东西

【问题讨论】:

    标签: gnuplot histogram legend


    【解决方案1】:
    脚本中的

    max(i)(带正则括号)不是数组的元素,而是函数。如何定义数组,取决于 gnuplot 的版本。如果是 4.x 或 5.0 则查看答案here,如果是 5.1 或更高版本,here 是演示脚本。此外,columnheader 似乎对我有用,至少对于这些数据而言。

    【讨论】:

    • columnheader 工作正常,但我写的它不适用于 sprintf。我使用的 sprointf,因为我需要将列名与例如MAX 列。关于数组解决方法,如您的链接中所述,它是可行的
    • @user1133275 已修复,删除末尾的 ']'。
    【解决方案2】:

    使用来自Michael O 的链接,描述数组变通方法,我重写了我的代码如下:

     headerrow = system('head -1 convertedDataMO.dat')
    
     arrGet(name, i) = value(sprintf("_%s_%i", name, i))
     arrSet(name, i, value) = sprintf("_%s_%i = %.16e", name, i, value)                   #"array" element with number
     arrSetStr(name, i, value) = sprintf("_%s_%i = % 30s", name, i, value)           #"array" element with string
    
    
     do for [i=2:9]{
        stats 'convertedDataMO.dat' using (column(i))
        eval arrSet("MAX",i,STATS_max)
        eval arrSet("MIN",i,STATS_min)
        columnName = sprintf("%s",word(headerrow,i))
        eval arrSetStr("COLUMN",i,"columnName")
     }
    
    
     set palette defined ( 0 "black", 1 "yellow",  2 "green", 3 "blue", 4 "red", 5 "orange" )
     plot for [i=2:9] "convertedDataMO.dat" using i:xticlabels(1) lt palette frac i/9. title sprintf("%30s%10s%10d%10s%10d",arrGet("COLUMN",i),"MIN",arrGet("MIN",i),"MAX",arrGet("MAX",i))
    

    数组的解决方法效果很好,但我也必须解决 columnheader,因为我没有找到在标题中的 sprintf 中使用它的方法。列名取自第一行,并插入“数组”中。

    最后是这个数据:

    Date    ParamA  ParamB  ParamC  ParamD  ParamE  ParamF  ParamG  ParamH
    20170406        ?       379     ?       354     ?       ?       ?       3095
    20170407        ?       469     ?       352     ?       ?       ?       1769
    20170408        ?       ?       ?       ?       168     306     ?       1875
    20170409        ?       ?       ?       ?       180     309     ?       2659
    20170410        ?       ?       ?       ?       168     306     ?       3283
    20170411        ?       ?       ?       ?       ?       306     395      1388
    20170412        ?       ?       ?       ?       105     306     ?       1565
    20170413        423     ?       ?       ?       ?       ?       762     1688
    

    重写的代码产生了这个图例:

    所以任务完成了:) (数据与问题中的不同,但工作方式相同)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-19
      • 1970-01-01
      • 2017-07-23
      • 1970-01-01
      • 1970-01-01
      • 2012-01-19
      • 1970-01-01
      相关资源
      最近更新 更多