我正在使用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))
但我有两个问题。
我是gnuplot的新手,所以我确定我错过了一些重要的事情
答案 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
所以完成任务:) (数据与问题中的数据不同,但它的工作方式相同)