无法删除matplotlib polycollection中的原点

时间:2013-04-30 17:01:23

标签: python matplotlib

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

enter image description here

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()

1 个答案:

答案 0 :(得分: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