我正在制作类似于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'>
答案 0 :(得分:2)
这里的关键点是ax.plot
会返回list
个Line3D
个对象(即使它是一个列表,在您的示例中只包含一个成员),而不是Line3D object itself
1}}。
因此,在您的第一个示例中,LINES
是list
个Line3D
个对象,在第二个示例中,list
为list
个line
秒。因此,在失败的代码中,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中每种颜色一行变为一行变为。