我在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()
答案 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。