【发布时间】:2016-01-20 08:40:28
【问题描述】:
我正在制作类似于 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'>
【问题讨论】:
-
在您的第一个示例中,
LINES是list的Line3D对象,在第二个示例中,它是list的lists。因此,在失败的代码中,line是一个包含单个Line3D对象的list。您尝试在该list对象上调用set_data,python 告诉您list没有该功能。您可以通过line = LINES[0][0]使其工作,但我无法掌握您在这里所做的事情的背景以获得总体目标。代码似乎相当复杂,仅对一个 3D 迷你图进行动画处理。 -
我不明白 why 第二部分的
LINES是lists 的list,但第一部分只有list。如果a=[1]则type(a[0])给出int。但是如果a=[ax.plot(..)],那么type(a[0])给出list。也许我应该将问题改写为。我只是错过了一些非常明显的东西吗? -
我添加了问题的“简化”版本。一旦我得到这个工作,我会寻找更简单的方法来绘制@JRichardSnape。但只要我不明白的东西我就放不下。
-
正如您所建议的,这基本上是
sum正在做的事情。我在下面添加了一个更完整的答案(当我可以让 imagemagick 工作时,我会发布 gif ......)。试试这个:sum([['a'],['long'],[string]],[])与[['a']]。这应该说明正在发生的事情。
标签: python matplotlib