Python - 使用一个 sns.histplot() 中的区间范围来绘制另一个直方图 / 从 sns.histpllot() 中提取区间信息

3

我想要将两个柱状图并排画出,第一个是完整数据集的,第二个是数据集的子集。为了比较,我想让它们都有相同的类区间,并且需要按照Freedman-Diaconis规则计算bin宽度,(可能是sns.histplot的默认模式,根据Stack Overflow回答)。

我想让第一个柱状图的bins使用sns.histplot()函数默认值。
然后,我想提取第一个图所使用的bin间隔或断点列表,并在生成第二个直方图时使用它作为参数。

import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt

from sklearn.datasets import load_boston
boston = load_boston()
df = pd.DataFrame(boston.data, columns=boston.feature_names)

# Histograms
f, axs = plt.subplots(1, 2, figsize=(15, 4.5))
a = sns.histplot(df['NOX'], ax=axs[0], color='steelblue')
b = sns.histplot(df.NOX[df.CRIM > 10.73], ax=axs[1], color='darkgreen')
plt.show()

问题:
1)如何提取sns.histplot()使用的箱子列表?
2)如何使用Freedman-Diaconis规则绘制具有相同箱子的2个直方图?


1
我认为你不能轻易地从 seaborn histplot 中提取 bins,但我可能是错的。 - Mr. T
谢谢@JohanC。你的建议很有用。如果你把它发表为答案,我会点赞的。 - rahul-ahuja
@JohanC,我也在寻找一种方法来注释两个直方图的条形并显示值和/或%。你有什么建议吗? - rahul-ahuja
1个回答

9

Seaborn通常不提供其计算结果,而是试图创建可视化图表。但是您可以使用相同的基础函数来获取其结果。您需要bins = np.histogram_bin_edges(..., bins='auto')(或者使用bins='fd'强制使用Freedman-Diaconis估算器)。然后使用sns.histplot(..., bins=bins)即可。

import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
from sklearn.datasets import load_boston

boston = load_boston()
df = pd.DataFrame(boston.data, columns=boston.feature_names)

bins = np.histogram_bin_edges(df['NOX'], bins='auto')
f, axs = plt.subplots(1, 2, figsize=(15, 4.5))
sns.histplot(df['NOX'], bins=bins, color='steelblue', ax=axs[0])
sns.histplot(df[df['CRIM'] > 10.73]['NOX'], bins=bins, color='darkgreen', ax=axs[1])
for ax in axs:
    for p in ax.patches:
        x, w, h = p.get_x(), p.get_width(), p.get_height()
        if h > 0:
            ax.text(x + w / 2, h, f'{h / len(df) * 100:.2f}%\n', ha='center', va='center', size=8)
    ax.margins(y=0.07)
plt.show()

example plot


1
我正在尝试在循环中为两个直方图打标签。我已经弄清楚了如何使用 for p in fig1.patches: ... 分别为它们打标签,但不知道如何在循环中为两个图表都打标签。 - rahul-ahuja

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接