簡體   English   中英

如何使用Perl對齊RRDtool圖圖例中的字段?

[英]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",

得到這個 對齊良好的RRDtool圖形圖例 比以前好多了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM