如何为 matplotlib 图着色以显示点密度?

问题描述 投票:0回答:2

我正在使用 matplotlib 绘制一些部分依赖图。我有 1,000 个样本,我对其进行回归预测。这些预测绘制在 y 轴上。为了了解整个数据集的部分依赖性的概述,我修复了示例中的所有变量,第一个。未固定的变量显示在 x 轴上,并且对于所有样本都是不同的。

在我的绘图中,我想显示给定 x 值的 1,000 个样本的平均值,以及在该 x 值处绘制为颜色梯度的值的分布。目前我有以下内容:

这是功能性的,因为它显示了给定 x 值的预测密度,但很难看。我想要的东西可以完成相同的工作,显示每个 x 值的密度,但这是填充绘图的平滑渐变,而不是单个点。

我怎样才能实现这样的目标?

python matplotlib plot
2个回答
0
投票

一个选项是用于 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()


0
投票

基于这个答案,并使用一些内核密度估计,(假设你对小提琴风格图感到满意!)你可以做相当于以下的事情:

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])

这给出:

如果您不想要小提琴风格,可以使用根据数据范围自行创建的矩形补丁来完成此操作。

© www.soinside.com 2019 - 2024. All rights reserved.