Python:在matplot散点图的x轴上绘制字符串时报错“无法将字符串转换为浮动”

3 投票
1 回答
5597 浏览
提问于 2025-04-19 10:49

我有一个字典 aggregate_dict,里面的键是字母 a 到 z,每个键对应的值是一个包含11个介于0到1之间的数字的列表。我想用这些数据来创建一个散点图,x轴上是字母从 a 到 z,y轴上是对应字母的值,像这样:

enter image description here

我通常在 R 语言中能很快搞定这个,但我现在的电脑上没有 R,也没有管理员权限,所以只能用 Python 来做。我打算用下面简化的字典来实现这个:

from matplotlib import pyplot

def scatterplot(x,y):
    pyplot.plot(x,y,'b.')
    pyplot.ylim(0,1)
    pyplot.title("Relative Frequency of Letters")
    pyplot.show()

x_vals = []
y_vals = []

aggregate_dict = {'a':[.1,.2,.3],'b':[.2,.3,.4]}

for u in aggregate_dict:
    x_vals.append(u)
    y_vals.append(aggregate_dict[u])

scatterplot( x_vals, y_vals )

可惜,这种方法出现了以下错误:

Traceback (most recent call last):
  File "C:/Users/dduhaime/Desktop/letter_distributions_each_section_tale.py", line 74, in <module>
    scatterplot(x_vals, y_vals )
  File "C:/Users/dduhaime/Desktop/letter_distributions_each_section_tale.py", line 56, in scatterplot
    pyplot.plot(x,y,'b.')
  File "C:\Python27\ArcGIS10.2\lib\site-packages\matplotlib\pyplot.py", line 2987, in plot
    ret = ax.plot(*args, **kwargs)
  File "C:\Python27\ArcGIS10.2\lib\site-packages\matplotlib\axes.py", line 4138, in plot
    self.add_line(line)
  File "C:\Python27\ArcGIS10.2\lib\site-packages\matplotlib\axes.py", line 1497, in add_line
    self._update_line_limits(line)
  File "C:\Python27\ArcGIS10.2\lib\site-packages\matplotlib\axes.py", line 1508, in _update_line_limits
    path = line.get_path()
  File "C:\Python27\ArcGIS10.2\lib\site-packages\matplotlib\lines.py", line 743, in get_path
    self.recache()
  File "C:\Python27\ArcGIS10.2\lib\site-packages\matplotlib\lines.py", line 420, in recache
    x = np.asarray(xconv, np.float_)
  File "C:\Python27\ArcGIS10.2\lib\site-packages\numpy\core\numeric.py", line 320, in asarray
    return array(a, dtype, copy=False, order=order)
ValueError: could not convert string to float: a

有没有人知道我该如何解决这个错误,继续我的绘图工作?我会很感激你们提供的任何建议!

1 个回答

3
import matplotlib.pyplot as plt
from matplotlib.ticker import FuncFormatter, MultipleLocator

x_data = np.arange(97, 110)
y_data = np.random.rand(len(x_data))

def ord_to_char(v, p=None):
    return chr(int(v))

fig, ax = plt.subplots()
ax.plot(x_data, y_data, 'x')
ax.xaxis.set_major_formatter(FuncFormatter(ord_to_char))
ax.xaxis.set_major_locator(MultipleLocator(1))
plt.show()

相关文档:http://matplotlib.org/api/ticker_api.html#module-matplotlib.ticker

撰写回答