2017-04-20 60 views
0

我使用pygal創建表格,link中的示例運行良好, 但我在其中做了以下更改。如何使用帶字符串記錄的pygal製作條形表。

line_chart = pygal.Bar() 
line_chart.title = 'Browser usage evolution (in %)' 
line_chart.x_labels = map(str, range(2002, 2013)) 
line_chart.add('Firefox', ["Hello", 'world', 'aaa', 'bbbb', 'ccc', 'cccc', 'dddd', 'eee', 'ffff', 'gggg', 'hhhh']) 
line_chart.add('Chrome', [None, None, None, None, None, None, 0, 3.9, 10.8, 23.8, 35.3]) 
line_chart.add('IE',  [85.8, 84.6, 84.7, 74.5, 66, 58.6, 54.7, 44.8, 36.2, 26.6, 20.1]) 
line_chart.add('Others', [14.2, 15.4, 15.3, 8.9, 9, 10.4, 8.9, 5.8, 6.7, 6.8, 7.5]) 
line_chart.value_formatter = lambda x: '%.2f%%' % x if x is not None else '∅' 
line_chart.render_table(style=True) 

爲火狐列,我在列表中添加字符串值,它給我的錯誤,如:

TypeError: unsupported operand type(s) for -: 'str' and 'int'

我怎麼能包括在pygal表中字符串的記錄?

回答

0

要了解你的問題,你將需要了解這一行:

line_chart.value_formatter = lambda x: '%.2f%%' % x if x is not None else '∅' 

走在函數什麼pygal這裏做應用到每個表值,以獲得一個字串值,被放入實際的表格中。在這種情況下,格式化程序需要一個數字(int或float)並使用較早的格式化語法進行格式化。 '%.2f%%' % x basically說:「我要把x放在這裏,修改字符串表示,使其至少強制兩位小數,然後在末尾添加'%'符號。此外,這個lambda函數在執行此操作之前檢查值是否不是None,因爲以這種方式格式化字符串值不會與None值一起工作,因爲它不是數字,並輸出該空字符。

在原始示例中,所有表中的值都是數值。一旦你用字符串值替換了firefox列/行,格式化程序就無法工作。您的錯誤來自功能lambda x: '%.2f%%' % x if x is not None else '∅'無法應用於字符串值。爲了解決這個問題,您可以A:更改格式器以接受字符串值或B:更改firefox中的值以使用數字而不是字符串。

你想字符串的記錄,所以要改變這種你可以添加一個檢查類型(即使用type(value) == int),或者如果你也想用字符串整數,第一次嘗試轉換(即int(value)float(value))。有關int檢查字符串的更多詳細信息,請參閱this post

例如你格式化lambda函數可能變成:

lambda x: '%.2f%%' % x if type(x) is int or type(x) is float else '∅' 

,如果你想要做的事,如轉換檢查,你將不得不嘗試:美中不足的是:它,所以你需要做一個實際的格式化函數而不是lambda。

相關問題