我正在使用 matplotlib 绘制一些部分依赖图。我有 1,000 个样本,我对其进行回归预测。这些预测绘制在 y 轴上。为了了解整个数据集的部分依赖性的概述,我修复了示例中的所有变量,第一个。未固定的变量显示在 x 轴上,并且对于所有样本都是不同的。
在我的绘图中,我想显示给定 x 值的 1,000 个样本的平均值,以及在该 x 值处绘制为颜色梯度的值的分布。目前我有以下内容:
这是功能性的,因为它显示了给定 x 值的预测密度,但很难看。我想要的东西可以完成相同的工作,显示每个 x 值的密度,但这是填充绘图的平滑渐变,而不是单个点。
我怎样才能实现这样的目标?
一个选项是用于 2d 数据的 seaborn
sns.histplot()
的最新版本。
这是一个使用seaborn 0.13.2测试的示例:
import matplotlib.pyplot as plt
import numpy as np
import seaborn as sns
np.random.seed(20240220)
y = 1.1 ** (80 + np.abs(np.random.randn(10000).cumsum()))
x = np.repeat([*'abcde'], len(y) // 5)
sns.histplot(x=x, y=y, log_scale=(False, True), discrete=(True, False))
sns.despine()
plt.show()
基于这个答案,并使用一些内核密度估计,(假设你对小提琴风格图感到满意!)你可以做相当于以下的事情:
from matplotlib import pyplot as plt
from matplotlib.path import Path
from matplotlib.patches import PathPatch
import matplotlib as mpl
import numpy as np
from scipy.stats import gaussian_kde
# create KDE
def kde(values, npoints=100):
vals = np.linspace(values.min(), values.max(), npoints, endpoint=True)
# generate and evaluate the KDE
return gaussian_kde(values)(vals)
data = [np.random.normal(loc=i, scale=1, size=(100,)) for i in range(3)]
fig, ax = plt.subplots()
violins = ax.violinplot(data, showextrema=False)
# get colour map
cmap = mpl.colormaps["Blues"]
# number of point to evaluate a Gaussian KDE
npoints = 100
ymin, ymax = ax.get_ylim()
xmin, xmax = ax.get_xlim()
# loop over each violin
for i, violin in enumerate(violins["bodies"]):
# get extent of violin
extent = violin.get_datalim(ax.transData)
# add new patch surrounding the violin
path = Path(violin.get_paths()[0].vertices)
patch = PathPatch(path, facecolor="none", edgecolor="none")
violin.set_visible(False) # make original violin invisible
ax.add_patch(patch)
# create image to show the gradient
cvalues = np.atleast_2d(kde(data[i], npoints)).T
img = ax.imshow(
cvalues,
origin="lower",
extent=[extent.xmin, extent.xmax, extent.ymin, extent.ymax],
cmap=cmap,
aspect="auto",
clip_path=patch,
)
# reset axes ranges
ax.set_xlim([xmin, xmax])
ax.set_ylim([ymin, ymax])
这给出:
如果您不想要小提琴风格,可以使用根据数据范围自行创建的矩形补丁来完成此操作。