与Unicode字符串一起使用时,matplotlib出错

时间:2014-02-18 14:43:50

标签: python numpy unicode matplotlib

我有包含Unicode字符串及其频率的文本文件。

അംഗങ്ങള്‍ക്ക്    10813
കുടുംബശ്രീ   10805
പരിരക്ഷാപദ്ധതിക്ക്   10778
ചെയ്തു   10718
ഇന്ന്‌   10716
അന്തര്‍     659
രാജിന്റെ    586 

当我尝试使用matplotlib

绘制它时

我收到此错误

Traceback (most recent call last):
  File "plot.py", line 3, in <module>
    xs, ys = np.loadtxt('oun.txt', delimiter='\t').T
  File "/usr/local/lib/python2.7/dist-packages/numpy/lib/npyio.py", line 841, in loadtxt
    items = [conv(val) for (conv, val) in zip(converters, vals)]
ValueError: could not convert string to float: ' 

这是我的代码

import numpy as np
import matplotlib.pyplot as plt
xs, ys = np.loadtxt('oun.txt', delimiter='\t').T
plt.bar(xs, ys)
plt.show()

这段代码有什么问题?

1 个答案:

答案 0 :(得分:3)

为了使用loadtxt从文件中读取字符串,您必须指定dtype参数(请参阅此处的docs)。

import matplotlib.pyplot as plt
import numpy as np

data = np.loadtxt('derp', dtype={'names': ('strings', 'freq'),
                                   'formats': ('S32', 'i4')})

xs, ys = zip(*data)
temp = range(len(ys)) # Temp variable for use as x-axis.

plt.bar(temp, ys, align='center')
plt.xticks(temp, xs) # Re-define ticks as your strings.

plt.show()

在这种情况下,该文件有2列,我给它们names ('strings', 'freq')formats('S32', 'i4'),其中S表示字符串i表示整数。可以找到dtype的文档here。请注意,dtype格式中的数字会提供有关列中值的大小的信息(i4对应于32位有符号整数)。