- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想在数据框中的 (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()
有没有办法将 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)
关于python - 在 PyPlot 背景图像的范围内剪辑 Seaborn Kdeplot,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53131151/
从 matplotlib 库中我导入了 pyplot 模块。在该模块中有一个我使用过的函数plot()。现在我的问题是: 为什么plot()函数不在任何类中?如果它在任何类中,为什么我们不创建该类的任
过去我可以使用带有 for 循环的 matplotlib 来制作简单的动画,但现在已经有一段时间没用了。 标准答案是您必须打开交互模式和/或使用matplotlib.pyplot.draw()强制重绘
我正在为一个研究项目绘制一些天气数据。该图由 18 个时间步组成。我认为实现此目的的最佳方法是为每个时间步长创建一个新图,将其保存为文件,然后为下一个时间步长创建一个新图(使用 for 循环)。 例如
from matplotlib import pyplot as plt import matplotlib.pyplot as plt 以上说法是否等价?哪种形式更具可读性/更好? 最佳答案 尽管它
我希望负条朝下,正条朝上,x轴(0线)正好在它们之间通过。我试过了 chart = fig.bar(x, negative_data, width=35, color='r') ax2 = plt.g
所以我想要的是让我的 pyplot 以科学记数法记号。所以每个刻度看起来像 1x10^6 而不是 1,然后是轴上的 10^6。到目前为止,我能够做到这一点的唯一方法是手动将每个刻度标签设置为 r'$1
我正在尝试针对 datetime 的列表绘制一些数据pyplot 在 x 轴上的对象。然而,日期显示为标准格式,即 %Y-%m-%d %H:%M:%S (太长了)。我可以通过使用 strftime 创
假设我有这个代码: num_rows = 10 num_cols = 1 fig, axs = plt.subplots(num_rows, num_cols, sharex=True) for i
我正在尝试绘制带有拟合虚线的散点图。 plt.scatter(x, y, s=z, alpha=0.5) m, b = np.polyfit(x, y, 1) y = [(m*i) + b for i
我想在 pyplot 图形中包含一些文本,并且能够在不改变比例的情况下放大它。请参阅下面的情节示例、我希望发生的事情以及实际发生的事情。 重现错误的代码: import matplotlib.pypl
我想显示第一次显示时放大的图像,但仍然可以使用图形工具栏中的交互式“重置原始 View ”按钮缩小到全比例。裁剪是完全 Not Acceptable 。使用 plt.axis([x0, x1, y0,
我正在尝试绘制带有拟合虚线的散点图。 plt.scatter(x, y, s=z, alpha=0.5) m, b = np.polyfit(x, y, 1) y = [(m*i) + b for i
我想在 pyplot 图形中包含一些文本,并且能够在不改变比例的情况下放大它。请参阅下面的情节示例、我希望发生的事情以及实际发生的事情。 重现错误的代码: import matplotlib.pypl
我正在编写一门类(class),以便制作符合我的多种需求的情节人物!我特别关注每个 pyplot 用户都知道的线型的循环(颜色和线型),有 4 种线型('-'、'--'、'-.'、':')但有一个选项
我特别想让其中一行比另一行早结束。它们是按时间顺序排列的(逐月和逐年)。 months= [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16] pass_2015 = [0
给定一个简单的负值列表:l = [0, -1, -1, -1, -10, -100] 使用标准方法 plt.hist(l) 可视化直方图的最快方法是什么? 我希望能够查看列表中的所有条目及其相对频率。
我有一个包含数据的文件,我将其分为三类。我想显示三个不同的“垃圾箱”,它们都只显示一个数字(该类别的平均值)。 import csv import matplotlib.pyplot as plt i
我不确定我的措辞是否正确,但我想做的是创建两个子图的图形,其中两个图有不同的限制,但它们的大小使得物理比例(如,y -人物高度每厘米的距离)是相同的。为了澄清起见,假设子图 1 显示从 -3 到 3
有谁知道为什么这段代码不能正确绘制框颜色。我希望每个组件都有不同的颜色,但它们都是黑色的,带有蓝色图例。 from numpy import array, zeros import matplotli
我在尝试使用 pyplot 标记数据时遇到了一场噩梦。 我目前正在绘制所有数据,如下所示:plt.plot(data)。 data 是一个数组,其中有一列是总成本,其他列是子成本 我想添加图例并适本地
我是一名优秀的程序员,十分优秀!