【问题标题】:Difficulty making just one Line3D object in matplotlib难以在 matplotlib 中仅制作一个 Line3D 对象
【发布时间】: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'>

【问题讨论】:

  • 在您的第一个示例中,LINESlistLine3D 对象,在第二个示例中,它是 listlists。因此,在失败的代码中,line 是一个包含单个 Line3D 对象的 list。您尝试在该list 对象上调用set_data,python 告诉您list 没有该功能。您可以通过line = LINES[0][0] 使其工作,但我无法掌握您在这里所做的事情的背景以获得总体目标。代码似乎相当复杂,仅对一个 3D 迷你图进行动画处理。
  • 我不明白 why 第二部分的LINESlists 的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


【解决方案1】:

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

因此,在您的第一个示例中,LINESLine3D 对象的 list,在第二个示例中,它是 lists 的 list。因此,在失败的代码中,line 是一个包含单个 Line3D 对象的 list。您尝试在该list 对象上调用set_data,python 告诉您list 没有该功能。你可以通过line = LINES[0][0] 来实现它,或者干脆做

LINES = ax.plot([],[],[], '-', c=colors[0])[0]

要获取您的 example code here 并使其仅绘制一行,请更改行:

# 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 只是一种将推导式的所有成员附加到一个大列表中的方法。上述更改从颜色图中的每种颜色一行变为单行。

【讨论】:

  • 宾果游戏!好的,现在很清楚了。我觉得自己没有弄清楚这一点有点傻。感谢您花时间清楚地解释正在发生的事情!下一步(可能还有问题)将简化动画。谢谢!
  • 没问题 - 另一双眼睛通常会有所帮助:)
猜你喜欢
  • 1970-01-01
  • 2021-03-29
  • 1970-01-01
  • 2019-01-08
  • 1970-01-01
  • 2020-09-04
  • 1970-01-01
  • 1970-01-01
  • 2019-02-15
相关资源
最近更新 更多