0

我正在使用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)

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

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

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

4

1 回答 1

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 检查字符串的更多详细信息, 请参阅这篇文章。

例如,您的格式化程序 lambda 函数可能变为:

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

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

于 2017-04-27T18:10:21.593 回答