[英]How can i use one perl script to create/populate and draw a RRDTool graph
[英]How can I align the fields in the legend of an RRDtool graph with Perl?
我正在使用RRD / RRDtool用Perl繪制圖形。 我能夠生成帶有圖例的圖形,但是我正在努力對齊圖例中的字段。
我使用的代碼是:
"COMMENT:---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------\\n",
"COMMENT:\t\t\t\t\t\t\tMinimum\t\t\tMaximum\t\t\tAverage\t\t\t\tCurrent\\n",
"COMMENT:---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------\\n",
"LINE2:e2gran#DF01D7:\t2GRAN\t\t\t\t",
"GPRINT:e2gmin:\t%6.3lf %s\t\t",
"GPRINT:e2gmax:\t%6.3lf %s\t\t",
"GPRINT:e2gaver:\t%6.3lf %s\t\t",
"GPRINT:e2glast:\t%6.3lf %s\\n",
"LINE2:e3gran#0000FF:\t3GRAN\t\t\t\t",
"GPRINT:e3gmin:\t%6.3lf %s\t\t",
"GPRINT:e3gmax:\t%6.3lf %s\t\t",
"GPRINT:e3gaver:\t%6.3lf %s\t\t",
"GPRINT:e3glast:\t%6.3lf %s\\n",
"LINE2:e4gran#FF8000:\t4GRAN\t\t\t\t",
"GPRINT:e4gmin:\t%6.3lf %s\t\t",
"GPRINT:e4gmax:\t%6.3lf %s\t\t",
"GPRINT:e4gaver:\t%6.3lf %s\t\t",
"GPRINT:e4glast:\t%6.3lf %s\\n",
"LINE2:e2gtran#FFFF00:\t2GTRAN\t\t\t",
"GPRINT:e2gtmin:\t%6.3lf %s\t\t",
"GPRINT:e2gtmax:\t%6.3lf %s\t\t",
"GPRINT:e2gtaver:\t%6.3lf %s\t\t",
"GPRINT:e2gtlast:\t%6.3lf %s\\n",
"LINE2:allregmax#FF0000:\tALL_REGIONS\t\t",
"GPRINT:allmin:%6.3lf%s\t\t",
"GPRINT:allmax:%6.3lf%s\t\t",
"GPRINT:allaver:%6.3lf%s\t\t",
"GPRINT:alllast:%6.3lf%s\\n",
"LINE3:wrongdata#000000:\\tINCOMPLETE DATA\\n",
圖例使用的字體是Arial。 輸出看起來像這樣:
雖然我的目標是這樣的:
我嘗試了TEXTALIGN
,擺弄了空格和制表符,並檢查了RRDtool文檔和其他教程,但我無法弄清楚。
你有兩個問題。
第一個問題是Arial字體是成比例的 。 每個字形都有不同的寬度。 在書中看起來不錯,但不適用於報告。
您需要使用等寬字體(例如Courier New )才能完全正常工作。
您的第二個問題是\\t
。
如果東西太寬,你可能有一個\\t
太多。 這就是為什么您看到的東西離左8個空間太遠了。 要解決此問題,請不要直接使用空格和制表符。 底層sprintf
具有創建列的語法。
您可以執行%-20s
以使寬度為20個字符的右對齊列始終填充空格。 您還可以執行% 15s
以使一個15個字符的列左對齊。
如果將其付諸實踐,我們將獲得:
my @cols = (
sprintf( '%-20s', '2GRAN' ),
sprintf( '% 15.3lf', 10_754 ),
sprintf( '% 15.3lf', 48_964 ),
sprintf( '% 15.3lf', 12_812 ),
);
print join '', @cols;
這將創建:
2GRAN 10754.000 48964.000 12812.000
現在,如果我們執行多行,它看起來仍然不錯。
foreach my $row (
[qw/ 2GRAN 10754 48964 12812 /],
[qw/ ASDFLONGERSTUFF 123 4444444 12312313 /],
)
{
CORE::say join '',
sprintf( '%-20s', $row->[0] ),
sprintf( '% 15.3lf', $row->[1] ),
sprintf( '% 15.3lf', $row->[2] ),
sprintf( '% 15.3lf', $row->[3] );
}
__END__
2GRAN 10754.000 48964.000 12812.000
ASDFLONGERSTUFF 123.000 4444444.000 12312313.000
請記住,您在問題中顯示的所有這些內容也只是Perl代碼。 其中一部分來自問題,另一部分來自chat 。
sub process_all_regions { my ($region, $start,$end,$description) = @_; RRDs::graph "$img/$region-$description-$start-days.png", "-s -$start d", "-e -$end d", #"-s -1$duration*86400", "--font","TITLE:18:Arial", "--font","AXIS:11:Arial", "--font","LEGEND:14:Courier New", "COMMENT:---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------\\\\n", "COMMENT:\\t\\t\\t\\t\\t\\t\\tMinimum\\t\\t\\tMaximum\\t\\t\\tAverage\\t\\t\\t\\tCurrent\\\\n", "COMMENT:---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------\\\\n", "LINE2:e2gran#DF01D7:\\t2GRAN\\t\\t\\t\\t", "GPRINT:e2gmin:\\t%6.3lf %s\\t\\t", "GPRINT:e2gmax:\\t%6.3lf %s\\t\\t", "GPRINT:e2gaver:\\t%6.3lf %s\\t\\t", "GPRINT:e2glast:\\t%6.3lf %s\\\\n",
所有帶有sprintf
模式的行僅是graph()
參數。 您不必將逐字記錄放入代碼中。 您可以以編程方式創建它們。 因此,如果您希望標題與數據具有相同的列寬,則可以自己使用sprintf
來構造它。
sprintf('COMMENT:%s\\n', '-' x 80),
sprintf('COMMENT:% 35s%15s%15s%15s\n', qw/Minimum Maximum Average Current/),
sprintf('COMMENT:%s\\n', '-' x 80),
感謝simbabque的大力幫助和提示,我設法使用了它(在RRD:graph聲明中):
"--font","LEGEND:14:Courier New",
sprintf('COMMENT:%s\\n', '-' x 110),
sprintf('COMMENT:% 35s%18s%19s%19s\n', qw/Minimum Maximum Average Current/),
sprintf('COMMENT:%s\\n', '-' x 110),
sprintf('LINE2:e2gran#DF01D7:%-11s','2GRAN'),
"GPRINT:e2gmin:% 19.0lf",
"GPRINT:e2gmax:% 16.0lf",
"GPRINT:e2gaver:% 16.0lf",
"GPRINT:e2glast:% 16.0lf\\n",
得到這個 比以前好多了。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.