如何使用pygal创建一个带有字符串记录的条形表。

时间:2017-04-20 13:38:17

标签: python pygal

我正在使用pygal创建表格,link中的示例效果很好, 但是我做了以下改动。

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)

对于Firefox列我在列表中添加字符串值,它给出了如下错误:

  

TypeError:不支持的操作数类型 - :'str'和'int'

如何在pygal表中包含字符串记录?

1 个答案:

答案 0 :(得分: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值,因为它不是数字,并且输出null字符。

在原始示例中,所有表值都是数值。一旦用字符串值替换了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 '∅'

如果你想做转换检查器之类的事情,你将不得不尝试:catch:它,所以你需要创建一个实际的格式化函数而不是lambda。