gpt4 book ai didi

python - 在 PyPlot 背景图像的范围内剪辑 Seaborn Kdeplot

转载 作者:行者123 更新时间:2023-12-01 08:50:58 26 4
gpt4 key购买 nike

我想在数据框中的 (x, y) 坐标提供的 NHL 溜冰场的背景图像上绘制 NHL 投篮及其分布(通过 Seaborn kdeplot)。我的代码生成的绘图 99% 达到了我想要的位置,但我不是 100% 确定如何剪切镜头贴图的边缘,使其不会超出加载图像的边界.

import os
import random

import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns
from PIL import Image, ImageDraw, ImageFont

random_events = ('SHOT', 'MISSED_SHOT', 'GOAL')
random_team = ('Preferred', 'Other')
events = list()

for i in range(30):
event = dict()
event['event_type'] = random.choice(random_events)
event['team'] = random.choice(random_team)
event['coords_x'] = round(random.uniform(-100, 100), 2)
event['coords_y'] = round(random.uniform(-42.5, 42.5), 2)
events.append(event)

df = pd.DataFrame(events)
pref_df = df.loc[df['team'] == 'Preferred']
other_df = df.loc[df['team'] == 'Other']

# Fix Coordinates
pref_df.loc[pref_df['coords_x'] < 0, ['coords_x', 'coords_y']] *= -1
other_df.loc[other_df['coords_x'] > 0, ['coords_x', 'coords_y']] *= -1

print(pref_df)
print(other_df)

MY_DPI = 96
IMG_WIDTH = 1024
IMG_HEIGHT = 440
fig = plt.figure(figsize=(IMG_WIDTH / MY_DPI, IMG_HEIGHT / MY_DPI), dpi=MY_DPI)
ax = fig.add_subplot(111, frameon=False, xticks=[], yticks=[])

ax_extent = [-100, 100, -42.5, 42.5]
img = Image.open('Rink-Shotmap-Blank.png')
plt.imshow(img, extent=ax_extent)

# Draw the seaborn portion of the graph
sns.set_style("white")
sns.kdeplot(pref_df.coords_x, pref_df.coords_y, cmap='Reds', shade=True, shade_lowest=False, alpha=0.6)
sns.kdeplot(other_df.coords_x, other_df.coords_y, cmap="Blues", shade=True, shade_lowest=False, alpha=0.6)

# Hide all axes & bounding boxes
ax.axes.get_xaxis().set_visible(False)
ax.axes.get_yaxis().set_visible(False)
ax.set_frame_on(False)
ax.axis('off')

plt.show()

Rink Shotmap

有没有办法将 kdeplot 剪切到 background image 的边界上(通过 ax.imshow 加载)?我尝试创建一个 Path 对象,它是一个范围大小的矩形,但没有成功。

如果对生成此代码的方式有任何其他建议,我将不胜感激,因为这些新的可视化库对我来说相对较新。

谢谢

最佳答案

如果能包含 Minimal, Complete, and Verifiable example 就更好了以便人们可以按照您提供的代码进行操作。但无论如何,使用 sns.kdeplot() 中的示例代码并使用 matplotlib 演示:Clipping images with patches ,使用任意 Patch

剪辑由 kdeplot 创建的 PathCollection 对象是相当简单的
iris = sns.load_dataset("iris")
setosa = iris.loc[iris.species == "setosa"]
virginica = iris.loc[iris.species == "virginica"]
ax = sns.kdeplot(setosa.sepal_width, setosa.sepal_length,
cmap="Reds", shade=True, shade_lowest=False)
ax = sns.kdeplot(virginica.sepal_width, virginica.sepal_length,
cmap="Blues", shade=True, shade_lowest=False)

# create a Patch object, here in data coordinates to clip the KDE plots
p = matplotlib.patches.Rectangle(xy=[2.5,5], width=2, height=3, transform=ax.transData, facecolor="xkcd:greenish", alpha=0.3, zorder=-1)
for col in ax.collections:
col.set_clip_path(p)

# simply for demonstration, show the patch on the axes (optional)
ax.add_patch(p)

enter image description here

关于python - 在 PyPlot 背景图像的范围内剪辑 Seaborn Kdeplot,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53131151/

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