sns.histplot 图例颜色与输出不匹配

sns.histplot legend colors not matching the output

我正在创建组合 boxplot\histplot。

一切都在运行,我得到了我期待的输出,除了一件事: 图例中的线条颜色与输出不匹配。

代码:

def boxhist(dfx, x):
    variable = dfx[x].values
    np.array(variable).mean()
    np.median(variable)

    f, (ax_box, ax_hist) = plt.subplots(2, sharex=True, gridspec_kw={"height_ratios": (0.5, 2)})
    mean = np.array(variable).mean()
    median = np.median(variable)

    sns.boxplot(variable, ax=ax_box)
    ax_box.axvline(mean, color='orange', linestyle='--')
    ax_box.axvline(median, color='black', linestyle='-')

    sns.histplot(data=variable, ax=ax_hist, kde=True, binwidth=2, facecolor='green').lines[0].set_color('red')
    ax_hist.axvline(mean, color='orange', linestyle='--')
    ax_hist.axvline(median, color='black', linestyle='-')

    plt.title(x, fontsize=10, loc='right')
    plt.legend({'Mean': mean, 'Median': median})
    ax_box.set(xlabel='')
    plt.tight_layout()
    plt.show()

输出:

平均值应该是橙色。 中位数应该是黑色的。

  1. 为什么图例中均值显示为红色,中位数显示为橙色?
  2. 我希望图例颜色与绘图输出匹配。 mean\orange, median\black.

您需要在 ax_hist.axvline(mean, ...., label='Mean') 中添加标签(中位数也类似)。然后 matplotlib 应该会自动将它们添加到图例中(当不带参数调用时)。

下面是一些示例代码:

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

def boxhist(dfx, x):
     variable = dfx[x].values
     variable.mean()
     np.median(variable)

     f, (ax_box, ax_hist) = plt.subplots(2, sharex=True, gridspec_kw={"height_ratios": (0.5, 2)})
     mean = variable.mean()
     median = np.median(variable)

     sns.boxplot(x=variable, ax=ax_box)
     ax_box.axvline(mean, color='orange', linestyle='--')
     ax_box.axvline(median, color='black', linestyle='-')

     sns.histplot(x=variable, ax=ax_hist, kde=True, binwidth=2, facecolor='green')
     ax_hist.lines[0].set_color('red')

     ax_hist.axvline(mean, color='orange', linestyle='--', label='Mean')
     ax_hist.axvline(median, color='black', linestyle='-', label='Median')

     ax_hist.set_title(x, fontsize=10, loc='right')
     ax_hist.legend()
     # ax_box.set(xlabel='') # has no effect on shared x-axis
     plt.tight_layout()
     plt.show()

dfx = pd.DataFrame({'bmi': np.random.normal(30.2, 5, 100)})
boxhist(dfx, 'bmi')