matplotlib 如何使用色调参数将中值标签添加到海运箱形图

ymdaylpp  于 2022-11-24  发布在  其他
关注(0)|答案(2)|浏览(125)

除了在this link中发布的解决方案外,我还希望添加色调参数,并在每个图中添加中值。
当前代码:

testPlot = sns.boxplot(x='Pclass', y='Age', hue='Sex', data=trainData)
m1 = trainData.groupby(['Pclass', 'Sex'])['Age'].median().values
mL1 = [str(np.round(s, 2)) for s in m1]
p1 = range(len(m1))

for tick, label in zip(p1, testPlot.get_xticklabels()):
    print(testPlot.text(p1[tick], m1[tick] + 1, mL1[tick]))

输出如下:

我正在研究泰坦尼克号数据集,可以在this link中找到。
我正在获取所需的值,但仅在执行打印语句时,如何将其包含在“绘图”中?

w46czmvw

w46czmvw1#

根据所有xticklabels循环中每个类别的色调参数和条形宽度手动放置标签:

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

trainData = pd.read_csv('titanic.csv')
testPlot = sns.boxplot(x='pclass', y='age', hue='sex', data=trainData)
m1 = trainData.groupby(['pclass', 'sex'])['age'].median().values
mL1 = [str(np.round(s, 2)) for s in m1]

ind = 0
for tick in range(len(testPlot.get_xticklabels())):
    testPlot.text(tick-.2, m1[ind+1]+1, mL1[ind+1],  horizontalalignment='center',  color='w', weight='semibold')
    testPlot.text(tick+.2, m1[ind]+1, mL1[ind], horizontalalignment='center', color='w', weight='semibold')
    ind += 2    
plt.show()

x6yk4ghg

x6yk4ghg2#

这个答案几乎是从here复制粘贴而来的,但更适合你的示例代码。恕我直言,链接的答案有点放错地方了,因为这个问题只是关于标记箱形图,而不是关于使用hue参数的箱形图。
我不能使用你的Train数据集,因为它没有Python包,所以我使用了Titanic,它有几乎相同的列名。

#!/usr/bin/env python3
import pandas as pd
import matplotlib
import matplotlib.patheffects as path_effects
import seaborn as sns

def add_median_labels(ax, fmt='.1f'):
    """Credits: https://stackoverflow.com/a/63295846/4865723
    """
    lines = ax.get_lines()
    boxes = [c for c in ax.get_children() if type(c).__name__ == 'PathPatch']
    lines_per_box = int(len(lines) / len(boxes))
    for median in lines[4:len(lines):lines_per_box]:
        x, y = (data.mean() for data in median.get_data())
        # choose value depending on horizontal or vertical plot orientation
        value = x if (median.get_xdata()[1] - median.get_xdata()[0]) == 0 else y
        text = ax.text(x, y, f'{value:{fmt}}', ha='center', va='center',
                       fontweight='bold', color='white')
        # create median-colored border around white text for contrast
        text.set_path_effects([
            path_effects.Stroke(linewidth=3, foreground=median.get_color()),
            path_effects.Normal(),
        ])

df = sns.load_dataset('titanic')
plot = sns.boxplot(x='pclass', y='age', hue='sex', data=df)
add_median_labels(plot)
plot.figure.show()

当你用基于图形的函数创建箱形图时,这是一种替代方法。在这种情况下,你需要将axes参数赋给add_median_labels()

# imports and add_median_labels() unchanged
df = sns.load_dataset('titanic')
plot = sns.catplot(kind='box', x='pclass', y='age', hue='sex', data=df)
add_median_labels(plot.axes[0][0])
plot.figure.show()

结果图

此解决方案还适用于hue参数所用列中的两个以上类别。

相关问题