7

我在 matplotlib 教程中尝试了一个 PolyCollection 示例,并注意到一件奇怪的事情。我无法从轴原点删除这些点,请参见图。我该如何管理?

在此处输入图像描述

from mpl_toolkits.mplot3d import Axes3D
from matplotlib.collections import PolyCollection
from matplotlib.colors import colorConverter
import matplotlib.pyplot as plt
import numpy as np

fig = plt.figure()
ax = fig.gca(projection='3d')

cc = lambda arg: colorConverter.to_rgba(arg, alpha=0.6)

xs = np.arange(5, 10, 0.4)
verts = []
zs = [0.0, 1.0, 2.0, 3.0]
for z in zs:
    ys = np.random.rand(len(xs))
    ys[0], ys[-1] = 0.1, 0
    verts.append(list(zip(xs, ys)))

poly = PolyCollection(verts, facecolors = [cc('r'), cc('g'), cc('b'),
                                           cc('y')])
poly.set_alpha(0.7)
ax.add_collection3d(poly, zs=zs, zdir='y')

ax.set_xlabel('X')
ax.set_xlim3d(0, 10)
ax.set_ylabel('Y')
ax.set_ylim3d(-1, 4)
ax.set_zlabel('Z')
ax.set_zlim3d(0, 1)

plt.show()
4

1 回答 1

4

这是 PolyCollection 的显式关闭功能的错误。

现在,把它关掉,你会得到我认为你期望的结果:

poly = PolyCollection(verts, facecolors = [cc('r'), cc('g'), cc('b'),
                                           cc('y')], closed=False)

这里唯一的问题是你在运行它时不应该得到你期望的结果,因为多边形不应该被关闭。这是另一个与 3D 代码相关的错误。无论如何,这只会影响边缘周围的线,在你的例子中它几乎没有任何区别(我最初认为它是正确的,直到我增加线宽才关闭)。

PolyCollection 使用 path.Path 对象来存储顶点,对于封闭的多边形,使用 CLOSEPOLY 顶点代码,它干净地关闭了路径(行中没有重叠)。

PolyCollections 的 3D 投影代码似乎是一种 hack,它获取您的 PolyCollection,提取路径,从这些路径中获取顶点,将这些顶点的代码扔掉并假设它们都是真实的顶点坐标,然后直接修改原始 PolyCollection 上的顶点以使用具有 2D 屏幕投影坐标且没有代码的新路径......并且无论您的设置如何,都已关闭。

我已将此作为问题#2045提交。

于 2013-05-21T23:18:12.617 回答