我正在使用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表中包含字符串记录?
答案 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。