对于一个给定的2D蒙版,我想画出它的轮廓,相邻网格单元之间没有内部线条。突出显示一个单元格非常简单:How to mark cells in matplotlib.pyplot.imshow (drawing cell borders)并突出显示许多单元格也很简单:Python matplotlib - add borders to grid plot based on value。但是,我不希望掩码内的内部边界被一条线分隔,因此上面的第二个链接不合适。
下面是生成掩码的示例代码:
import matplotlib.pyplot as plt
import numpy as np
N = 50
xbound = np.linspace(0, 10, N + 1)
ybound = np.linspace(0, 10, N + 1)
x = (xbound[:-1] + xbound[1:]) / 2
y = (ybound[:-1] + ybound[1:]) / 2
X, Y = np.meshgrid(x, y)
Z = np.exp(-((X - 2.5)**2 + (Y - 2.5)**2)) + np.exp(-2 * ((X - 7.5)**2 + (Y - 6.5)**2))
mask = Z > 0.2
plt.imshow(mask, origin='lower', extent=(0, 10, 0, 10))
生成图像的步骤:
我希望边界围绕每个像素化的黄色圆圈,并遵循上面显示的相同边缘(即平行于x/y轴)-我想强调的是,底层数据是网格化的。使用:
plt.contour(x, y, mask, levels=[0.5])
接近,但轮廓沿着楼梯边缘呈45°。
如果轮廓可以填充或显示使用制图加分。
1条答案
按热度按时间kxeu7u2r1#
这可以使用
shapely
形状和union操作来完成。这个想法是为掩码为真的每个单元格创建一个正方形(或矩形等),然后将相邻的正方形组合在一起。然后可以绘制这些几何图形,或使用这些几何图形创建matplotlib
多边形。下图以红色显示轮廓(根据需要带有楼梯边缘):很难用颜色/图案填充每个形状,因此可以使用
matplotlib
多边形:最后,可以将原始
shapely
多边形直接添加到制图图中: