我正在尝试绘制文本值而不是符号(对于MDS解决方案),而matplotlib.pyplot
给出了我不理解的错误。我已经更新了ipython和matplotlib,以确保它不是一个老问题(或旧版本的问题),而且我无法在这里(或通过谷歌的其他地方)找到任何类似问题的答案或报告。
因此,例如,在调用ipython --pylab
之后,如果我输入:
x = random.rand(4)
y = random.rand(4)
s = [str(i) for i in arange(4)+1]
text(x,y,s)
我收到此错误:
Traceback (most recent call last):
File "//anaconda/lib/python2.7/site-packages/matplotlib/artist.py", line 55, in
draw_wrapper draw(artist, renderer, *args, **kwargs)
File "//anaconda/lib/python2.7/site-packages/matplotlib/figure.py", line 1034, in draw
func(*args)
File "//anaconda/lib/python2.7/site-packages/matplotlib/artist.py", line 55, in
draw_wrapper draw(artist, renderer, *args, **kwargs)
File "//anaconda/lib/python2.7/site-packages/matplotlib/axes.py", line 2086, in draw
a.draw(renderer)
File "//anaconda/lib/python2.7/site-packages/matplotlib/artist.py", line 55, in
draw_wrapper draw(artist, renderer, *args, **kwargs)
File "//anaconda/lib/python2.7/site-packages/matplotlib/text.py", line 547, in draw
bbox, info, descent = self._get_layout(renderer)
File "//anaconda/lib/python2.7/site-packages/matplotlib/text.py", line 287, in
_get_layout key = self.get_prop_tup()
File "//anaconda/lib/python2.7/site-packages/matplotlib/text.py", line 696, in
get_prop_tup x, y = self.get_position()
File "//anaconda/lib/python2.7/site-packages/matplotlib/text.py", line 684, in
get_position x = float(self.convert_xunits(self._x))
TypeError: only length-1 arrays can be converted to Python scalars
如果我尝试使用标量而不是向量/列表(例如text(x[0],y[0],s[0])
或text
函数的参数的任意数量的变体)来调用文本,则会出现相同的错误。同样的事情发生了:
figtext
,import matplotlib.pyplot as plt
并致电plt.text
和scatter(x,y)
。另外,对于它的价值,一旦出现此问题,如果我手动调整图形大小,则会再次出现错误消息。可能相关的是,图形的变化不会自动更新,而是在我在另一个子图中绘图或手动调整图形之后。但我离题了。
我在Mac上有一个更新的Anaconda安装(有Mavericks),如上所述,我正在使用iPython。
答案 0 :(得分:4)
plt.text
需要单个x,y和字符串值,而不是序列。 (见:http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.text)
只需使用循环。
例如:
import numpy as np
import matplotlib.pyplot as plt
x, y = np.random.rand(2,4)
s = [str(i) for i in np.arange(1, 5)]
fig, ax = plt.subplots()
text = [ax.text(*item) for item in zip(x, y, s)]
plt.show()