难以在matplotlib

时间:2016-01-20 08:40:28

标签: python matplotlib

我正在制作类似于here的3D线对象,它实际上来自here

我想动画一行,而不是很多行,我无法弄清楚这里发生了什么。我认为这与sum()的工作方式有关。

我怎样才能制作一个,为什么会失败?

from matplotlib import pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from matplotlib.colors import cnames

fig = plt.figure()
ax = fig.add_axes([0, 0, 1, 1], projection='3d')
colors = plt.cm.jet([0.3, 0.7])

LINES = sum([ax.plot([],[],[], '-', c=c) for c in colors], [])
line = LINES[0]
line.set_data([], [])                 # THIS WORKS

LINES = [ax.plot([],[],[], '-', c=colors[0])]
line = LINES[0]
line.set_data([], [])                 # THIS FAILS

所以我可以进一步减少我的问题:

a = [1]
print "type(a[0]): ", type(a[0])   # expect <type 'int'>

b = [ax.plot([],[],[], '-', c=colors[0])]
print "type(b[0]): ", type(b[0])   # expect <class 'mpl_toolkits.mplot3d.art3d.Line3D'>

给出

<type 'int'>
<type 'list'>

1 个答案:

答案 0 :(得分:2)

这里的关键点是ax.plot会返回listLine3D个对象(即使它是一个列表,在您的示例中只包含一个成员),而不是Line3D object itself 1}}。

因此,在您的第一个示例中,LINESlistLine3D个对象,在第二个示例中,listlistline秒。因此,在失败的代码中,list是一个Line3D,它构成一个set_data个对象。您尝试在list对象上调用list,python告诉您line = LINES[0][0]没有该功能。您可以通过执行LINES = ax.plot([],[],[], '-', c=colors[0])[0] 或仅执行

来使其工作
# set up lines and points
lines = sum([ax.plot([], [], [], '-', c=c)
             for c in colors], [])
pts = sum([ax.plot([], [], [], 'o', c=c)
           for c in colors], [])

要拍摄example code here并使其仅绘制一行,请更改以下行:

# set up lines and points
lines = ax.plot([], [], [], '-', c=colors[0])
pts = ax.plot([], [], [], 'o', c=colors[0])

阅读

sum

GET / @controllers.Application.index() 只是将所有理解成员附加到一个大列表中的一种方法。上面的更改从在colormap中每种颜色一行变为一行变为。