gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 21:54:02 27 4
gpt4 key购买 nike

我正在使用 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')

out

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

编辑:我知道我可以放大以查看其他内容,但我希望在不执行此操作的情况下看到一个点或轮廓或其他内容。

编辑 2:这是一种获得所需效果的方法,方法是使用 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))

out_line2d

最佳答案

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

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

通过

ax.set_xlim(1e-1, 1e1)
ax.set_ylim(1e-5, 1e0)
ax.set_xscale('log')
ax.set_yscale('log')
ax.set_aspect('equal')

您的五个多边形现在可见,但在不利方面,对数刻度将您限制在轴的正侧。 enter image description here
现在提出你的问题的答案。如果您保留一个线性轴,因为您的多边形大小跨越多个数量级,您将无法看到它们的全部。你可以做的是在你的地 block 上添加一位艺术家,指定他们的位置。这可以通过标记、箭头等来完成...如果我们以标记为例,如您所说,如果我们看不到多边形,我们只想看到这个标记。调用 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()

产生 enter image description here
您会注意到,如果放大 matplotlib 图中的最后两个点,您实际上看不到标记,而是多边形。

关于python - 当多边形变得太小时,带有 polycollection 的图消失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53268881/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com