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
相关产品推荐
相关产品推荐

