python – 在seaborn图上设置剪辑

我在修剪一个seaborn情节(特别是一个kdeplot)时遇到了麻烦,因为我认为每个this example in the matplotlib docs都相当简单.

例如,以下代码:

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)

结果如下:

python  – 在seaborn图上设置剪辑

我想剪切这个结果,以便KDE轮廓线不会出现在圆圈之外.到目前为止,我还没有办法做到这一点……这可能吗?

解决方法:

Serenity的答案适用于简单的形状,但是当形状包含超过三个左右的顶点时,由于未知原因而分解(我甚至难以确定精确的参数).对于足够大的形状,填充物流入边缘所在的位置,as for example here.

然而,这确实让我想到了正确的道路.虽然单纯使用matplotlib原生代码似乎不可能这样做(也许他提供的代码中有错误?),使用shapely库时这很容易,这就像这样的任务.

生成形状

在这种情况下,您将需要匀称的symmetric_difference方法. symmetric difference是此切除操作的集合理论名称.

在这个例子中,我加载了一个曼哈顿形状的多边形作为shapely.geometry.Polygon对象.我不会在这里隐藏初始化过程,它很容易做,以及你期望的一切.

我们可以使用manhattan.envelope在我们的曼哈顿周围绘制一个方框,然后应用差异.这是以下内容:

unmanhattan = manhattan.envelope.symmetric_difference(manhattan)

这样做可以让我们:

python  – 在seaborn图上设置剪辑

将其添加到绘图中

好的,但这是一个形状对象而不是matplotlib补丁,我们如何将它添加到情节? descartes库处理此转换.

unmanhattan_patch = descartes.PolygonPatch(unmanhattan)

这就是我们所需要的!现在我们做:

unmanhattan_patch = descartes.PolygonPatch(unmanhattan)
ax.add_patch(unmanhattan_patch)
sns.kdeplot(x=points['x_coord'], y=points['y_coord'], ax=ax)

得到:

python  – 在seaborn图上设置剪辑

通过稍微更多的工作将其扩展到视图(纽约市)中的其余多边形,我们可以获得以下最终结果:

python  – 在seaborn图上设置剪辑

上一篇:python – 是否有可能用seaborn画出破碎的轴图?


下一篇:python – 如何使用tsplot设置多个标记?