Seaborn小提琴图叠加散点图失败问题及解决方案
解决Seaborn小提琴图与散点图叠加显示偏差的问题
需求:对比两个数据集,用Seaborn绘制小提琴图展示数据集df2,用stripplot散点图展示数据集df,但初始代码无法实现两图叠加,存在显示偏差。
初始代码片段
figure, ax = plt.subplots(1, 1, figsize=(10,10)) ax = sns.violinplot(data=df2.rolling(window=3).mean(), split=False, color="pink") sns.stripplot(data=df.rolling(window=3).mean(), dodge=True, linewidth=1, jitter=False, ax=ax)
数据集描述
df2的统计信息
Bafoussam count 1395.000000 mean 7.030180 std 10.730945 min 0.000000 25% 0.000000 50% 2.900000 75% 9.800000 max 102.300003
df的统计信息
Bafoussam Dschang count 31.000000 31.000000 mean 16.980645 26.138710 std 25.344683 31.060786 min 0.000000 0.000000 25% 0.000000 0.000000 50% 8.200000 8.100000 75% 24.500000 48.800000 max 96.200000 90.600000
最终实现代码
fig = plt.figure(figsize=(10,14)) gs = fig.add_gridspec(2, 2) ax1 = fig.add_subplot(gs[0, 0]) ax2 = fig.add_subplot(gs[0, 1]) ax3 = fig.add_subplot(gs[1, 0]) ax4 = fig.add_subplot(gs[1, 1]) sns.violinplot(data=df2["Station1"], split=False, color="pink", inner=None, ax=ax1) sns.stripplot(data=df["Statation1"], dodge=True, linewidth=1, jitter=False, ax=ax1, color="red", size=16) sns.violinplot(data=df2["Station2"].rolling(window=rday).mean(), inner=None, split=False, color="pink", ax=ax2) sns.stripplot(data=df["Station2"].rolling(window=rday).mean(), dodge=True, linewidth=1, jitter=False, ax=ax2, color="red", size=16)
关键调整点
- 采用网格布局拆分多个子图,分别对应不同站点的数据对比,避免单图叠加的显示冲突
- 给小提琴图添加
inner=None参数,减少内部元素干扰,让散点图更清晰 - 明确指定每个绘图函数的
ax参数,确保图形绘制在目标子图上 - 调整散点图的颜色、大小,提升叠加后的可视化辨识度
内容的提问来源于stack exchange,提问作者Appolinaire Derbetini
相关产品推荐
相关产品推荐

