我只想动一条线,不是很多条线,我不知道这里发生了什么。我认为这与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'>
发布于 2016-01-20 16:21:09
这里的关键点是,ax.plot
返回list
of Line3D
对象(尽管它是一个包含示例中单个成员的列表),而不是Line3D object itself
。
因此,在您的第一个示例中,LINES
是一个Line3D
对象的list
,在第二个示例中,它是一个list
的list
,因此,在失败的代码中,line
是一个包含单个Line3D
对象的list
。您尝试在那个set_data
对象上调用list
,python告诉您list
没有这个函数。您可以通过执行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], [])
阅读
# set up lines and points
lines = ax.plot([], [], [], '-', c=colors[0])
pts = ax.plot([], [], [], 'o', c=colors[0])
sum
只是将理解的所有成员附加到一个大列表中的一种方式。上面的变化会从彩色地图上的每一行变化到单行。
https://stackoverflow.com/questions/34895165
复制相似问题