当多边形变得太小时,带有polycollection的绘图会消失

Sta*_*Bak 7 python matplotlib

我用a PolyCollection来绘制各种尺寸的数据.有时候多边形非常小.如果它们太小,它们根本就不会被绘制.我希望大纲至少能够显示出来,这样你才能知道有些数据存在.有控制这个的设置吗?

这里是一些重现问题的代码,以及输出图像:

import matplotlib.pyplot as plt
from matplotlib.collections import PolyCollection
from matplotlib import colors

fig = plt.figure()
ax = fig.add_subplot(111)
verts = []

edge_col = colors.colorConverter.to_rgb('lime')
face_col = [(2.0 + val) / 3.0 for val in edge_col] # a little lighter

for i in range(10):
    w = 0.5 * 10**(-i)
    xs = [i - w, i - w, i + w, i - w]
    ys = [-w, w, 0, -w]

    verts.append(list(zip(xs, ys)))

ax.set_xlim(-1, 11)
ax.set_ylim(-2, 2)

ax.add_collection(PolyCollection(verts, lw=3, alpha=0.5, edgecolor=edge_col, facecolor=face_col))

plt.savefig('out.png')
Run Code Online (Sandbox Code Playgroud)

出

请注意,只有六个多边形可见,而应该有十个.

编辑:我知道我可以放大以查看其他人,但我希望看到一个点或大纲或其他东西而不这样做.

编辑2:这是一种获得所需效果的方法,通过使用a绘制面PolyCollection,然后Line2D根据Patol75的答案使用带标记的一系列绘图边.我的应用程序是一个matplotlib包含大量多边形的动画,所以我宁愿避免Line2D效率,如果我不需要两次绘制东西,它会更清晰,所以我仍然希望有更好的答案.

ax.add_collection(PolyCollection(verts, lw=3, alpha=0.5, edgecolor=None, facecolor=face_col, zorder=1))

for pts in verts:
    ax.add_line(Line2D([pt[0] for pt in pts], [pt[1] for pt in pts], lw=3, alpha=0.5, color=edge_col,
                                 marker='.', ms=1, mec=edge_col, solid_capstyle='projecting', zorder=2))
Run Code Online (Sandbox Code Playgroud)

out_line2d

Pat*_*l75 2

放大绘图窗口,您会注意到正在绘制剩余的两个多边形。它们太小了,你看不到它们。确信这一点的一种方法是替换

ax.set_xlim(-1, 6)
ax.set_ylim(-2, 2)
Run Code Online (Sandbox Code Playgroud)

经过

ax.set_xlim(1e-1, 1e1)
ax.set_ylim(1e-5, 1e0)
ax.set_xscale('log')
ax.set_yscale('log')
ax.set_aspect('equal')
Run Code Online (Sandbox Code Playgroud)

您的五个多边形现在可见,但在不利的一面,对数刻度将您限制在轴的正侧。 在此输入图像描述
现在提出您的问题的答案。如果您保留线性轴,因为您的多边形大小跨越多个数量级,您将无法看到全部。您可以做的就是在您的地块上添加一位艺术家,指定他们的位置。这可以通过标记、箭头等来完成...如果我们以标记为例,正如您所说,如果我们看不到多边形,我们只想看到该标记。调用plot() 中的关键字zorder 允许指定哪个艺术家应在图形上具有显示优先级。请考虑下面的例子。

import matplotlib.pyplot as plt
from matplotlib.collections import PolyCollection
fig = plt.figure()
ax = fig.add_subplot(111)
verts = []
for i in range(5):
    w = 0.5 * 10**(-i)
    xs = [i - w, i - w, i + w, i + w, i - w]
    ys = [-w, w, w, -w, -w]
    ax.plot((xs[2] + xs[1]) / 2, (ys[1] + ys[0]) / 2, linestyle='none',
            marker='o', color='xkcd:crimson',  markersize=1, zorder=-1)
    verts.append(list(zip(xs, ys)))
ax.set_xlim(-1, 6)
ax.set_ylim(-2, 2)
poly = PolyCollection(verts, lw=5, edgecolor='black', facecolor='gray')
ax.add_collection(poly)
plt.show()
Run Code Online (Sandbox Code Playgroud)

产生 在此输入图像描述
您会注意到,如果放大 matplotlib 图形中的最后两个点,您实际上看不到标记,而是看到多边形。