Ale*_*gur 5 python matplotlib seaborn
我在剪辑一个seaborn情节(特别是 a kdeplot)时遇到了麻烦,因为我认为根据matplotlib文档中的这个例子会相当简单。
例如,以下代码:
import matplotlib.pyplot as plt
import numpy as np
import seaborn as sns
fig = plt.figure()
ax = fig.add_subplot(111, frameon=False, xticks=[], yticks=[])
random_points = np.array([p for p in np.random.random(size=(100, 2)) if 0 < p[0] < 1 and 0 < p[1] < 1])
kde = sns.kdeplot(random_points[:,0], random_points[:,1], ax=ax)
xmin, xmax = kde.get_xlim()
ymin, ymax = kde.get_ylim()
patch = mpl.patches.Circle(((xmin + xmax)/2, (ymin + ymax) / 2), radius=0.4)
ax.add_patch(patch)
kde.set_clip_path(patch)
Run Code Online (Sandbox Code Playgroud)
结果如下:
我想剪辑这个结果,这样 KDE 轮廓线就不会出现在圆圈之外。到目前为止我还没有找到办法做到这一点……这可能吗?
Serenity 的答案适用于简单的形状,但当形状包含超过三个左右的顶点时,由于未知的原因会崩溃(甚至我很难确定确切的参数)。对于足够大的形状,填充会流入边缘应在的位置,例如此处。
然而,它确实让我沿着正确的道路思考。虽然简单地使用本机似乎不可能做到这一点matplotlib(也许他提供的代码中存在错误?),但使用该shapely库时非常简单,该库适用于像这样的任务。
生成形状
在这种情况下,您将需要 shapely 的symmetric_difference方法。对称差是这种切除操作的集合理论名称。
在本例中,我加载了一个曼哈顿形状的多边形作为shapely.geometry.Polygon对象。我不会在这里隐藏初始化过程,它很容易做到,并且满足您的期望。
manhattan我们可以在using周围画一个框manhattan.envelope,然后应用差异。这是以下内容:
unmanhattan = manhattan.envelope.symmetric_difference(manhattan)
Run Code Online (Sandbox Code Playgroud)
这样做可以让我们:
将其添加到绘图中
好的,但这是一个shapely对象而不是 a matplotlib Patch,我们如何将它添加到图中?该descartes库处理此转换。
unmanhattan_patch = descartes.PolygonPatch(unmanhattan)
Run Code Online (Sandbox Code Playgroud)
这就是我们所需要的!现在我们做:
unmanhattan_patch = descartes.PolygonPatch(unmanhattan)
ax.add_patch(unmanhattan_patch)
sns.kdeplot(x=points['x_coord'], y=points['y_coord'], ax=ax)
Run Code Online (Sandbox Code Playgroud)
并得到:
通过更多的工作将其扩展到视图中的其余多边形(纽约市),我们可以获得以下最终结果: