2017-04-13 75 views
0

我正在用GNUPlot绘制图表。我能够产生具有传奇叠加柱状图,但我在努力扩大与MIX,MAX等每个项目的价值,像我的传说设法与RRDTool的GNUPLOT - 如何在图例中显示最大值

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)只显示我是新来GNUPLOT,所以我相信最后的值(从sprintf的去除的columnHeader后测试)

我在这里丢失了一些重要的东西

回答

1

max(i)(带正则括号)在脚本中不是数组的元素,而是函数。你如何定义数组取决于gnuplot的版本。如果它是4.x或5.0,那么请参阅here,如果它是5.1或更高,则here是演示脚本。另外,columnheader似乎适用于我,至少对于这些数据。

+0

columnheader工作正常,但我写它不适用于sprintf。我使用的sprointf,因为我需要将列名与例如MAX列。关于数组解决方法,在您的链接中提到它的可行性 – taiko

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

这样的任务是完成:) (数据比的问题不同,但它的工作原理相同)