You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

pandas boxplot结合seaborn pointplot时箱线图偏移丢失问题求解

箱线图叠加点线图偏移问题解决方案

问题原因

这不是框架BUG,是两个绘图API的x轴坐标映射规则不一致导致的:

  • pandas的boxplot针对分类列a的两个取值1、2,会直接将箱线放在x轴坐标1和2的位置
  • seaborn的pointplot默认将分类列视为离散类别,不关联类别实际数值,第一个类别对应x轴0位置,第二个对应x轴1位置,两个图的x轴坐标基准不匹配,就会出现偏移、遮挡的问题。

解决方法

方案1:统一使用seaborn的绘图API(推荐)

用seaborn的boxplot替代pandas的boxplot,二者分类坐标规则完全一致,不会出现错位问题:

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

d = {'val': [1, 2,3,4], 'a': [1, 1, 2, 2]}
d2 = {'val': [1, 2], 'a': [1, 2]}

df = pd.DataFrame(data=d)
df2 = pd.DataFrame(data=d2)

ax = sns.boxplot(x='a', y='val', data=df, meanline=True, showmeans=True, showcaps=True, showbox=True)
sns.pointplot(x='a', y='val', data=df2, ax=ax)
# 可去掉pandas boxplot默认生成的分组标题
plt.suptitle('')
plt.show()

方案2:保留pandas boxplot,手动对齐pointplot坐标

如果需要保留pandas的boxplot用法,可手动指定pointplot的x坐标为a的实际数值,匹配pandas的坐标基准:

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

d = {'val': [1, 2,3,4], 'a': [1, 1, 2, 2]}
d2 = {'val': [1, 2], 'a': [1, 2]}

df = pd.DataFrame(data=d)
df2 = pd.DataFrame(data=d2)

ax = df.boxplot(column=['val'], by = ['a'],meanline=True, showmeans=True, showcaps=True,showbox=True)
# 直接传入数值作为x坐标,不使用seaborn的默认分类映射
sns.pointplot(x=df2['a'], y=df2['val'], ax=ax)
# 调整x轴刻度显示符合预期
ax.set_xticks([1,2])
ax.set_xticklabels([1,2])
plt.suptitle('')
plt.show()

内容的提问来源于stack exchange,提问作者Ivan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 20:27:01