Я хочу построить график снимков НХЛ и их распределения (через kdeplot Seaborn) на фоновом изображении катка НХЛ, предоставленного (x, y) координатами в кадре данных. Код, который у меня есть, генерирует график на 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()

Есть ли способ обрезать kdeplot по границам фонового изображения (загружается через ax.imshow
)? Я попытался создать объект Path
, который представляет собой прямоугольник размером с экстент, но безуспешно.
Если есть какие-либо другие предложения относительно того, как генерируется этот код, это будет очень полезно, так как эти новые библиотеки визуализации являются относительно новыми для меня.
Спасибо