GNUPLOT - 如何在图例中显示最大值

时间:2017-04-13 12:07:34

标签: gnuplot histogram legend

我正在使用GNUPlot绘制图表。我能够生成带有图例的堆积直方图,但是我很难用每个项目的MIX,MAX等值来扩展图例,就像我设法用RRDTool一样

enter image description here

我的数据看起来像这样

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中删除列标题后测试)
  3. 我是gnuplot的新手,所以我确定我错过了一些重要的事情

2 个答案:

答案 0 :(得分:2)

脚本中的

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

答案 1 :(得分:0)

使用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

重写的代码产生了这个图例: enter image description here

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