假设我有数据,我想将其绘制成箱线图并与 seaborn 中的群图叠加,其中点的颜色为数据添加了额外的信息。
问题:如何才能让箱线图对于给定的 x 轴值彼此接近(就像在色调中所做的那样),而无需将 x 重构为色调值和 x 轴值?
例如,在这里我想将点叠加到箱线图上,并希望这些点进一步着色‘sex’。示例:
‘sex’
plt.figure(figsize = (5, 5)) sns.boxplot(x = 'class', y = 'age', hue = 'embarked', dodge = True, data = df) sns.swarmplot(x = 'class', y = 'age', dodge = True, color = '0.25', hue = 'sex', data = df) plt.legend(bbox_to_anchor = (1.5, 1))
编辑:我们的想法是在图中得到一些看起来像“第三”的“S”框的东西(我在 powerpoint 中做了一个假的例子,所以hue在和中都是相同的boxplot,swarmplot以将点叠加在相应的框上)。
hue
boxplot
swarmplot
有没有办法制作这个图,而不用先将 x 轴重构为“first-S”、“first-C”、“first-Q”、“second-S”等,然后在两个图中hue添加?’sex’
’sex’
为了实现您的目标,即在箱线图中叠加群图,并使得群图点的颜色根据额外信息(如'sex')着色,同时避免重构 x 轴,可以通过调整点的位置使其匹配箱线图的位置,同时通过颜色区分群图点的额外属性。
'sex'
下面是一个示例代码实现:
import seaborn as sns import matplotlib.pyplot as plt import pandas as pd # 使用 Titanic 数据集作为示例 df = sns.load_dataset('titanic') plt.figure(figsize=(10, 6)) # 绘制箱线图,使用 'class' 和 'embarked' 作为 x 和 hue sns.boxplot( x='class', y='age', hue='embarked', dodge=True, data=df, showfliers=False, palette="Set2" ) # 获取箱线图中箱体的位置 # Seaborn's dodge effect offsets the x-axis positions for different hues positions = [] for i, group in enumerate(df['class'].unique()): group_data = df[df['class'] == group]['embarked'].dropna().unique() positions += [(i - 0.2 + j * 0.4 / len(group_data)) for j in range(len(group_data))] # 绘制群图点,颜色按 'sex' 区分 sns.swarmplot( x='class', y='age', hue='sex', data=df, dodge=True, palette='cool', alpha=0.7 ) # 调整图例 handles, labels = plt.gca().get_legend_handles_labels() plt.legend(handles[:len(df['embarked'].unique())], labels[:len(df['embarked'].unique())], title='Embarked', bbox_to_anchor=(1.05, 1)) plt.show()
使用 dodge=True 参数使得箱线图和群图根据不同的 hue 值对数据进行偏移(默认分隔开箱图的位置)。
dodge=True
点的颜色与额外信息挂钩:
在 swarmplot 中,添加额外的 hue='sex' 并指定 palette,从而为点提供基于性别的颜色区分。
hue='sex'
palette
对齐点和箱体:
positions
如果需要进一步调整点的对齐或分布,可以通过控制 dodge 和 width 等参数来微调外观。这个方法避免了对 x 轴的重构,同时实现了按群体特征区分的箱线图和群图的叠加效果。
dodge
width
x