首页 > 解决方案 > pandas boxplot 中 boxplot 的奇怪变化将其与 seaborn pointplot 相结合 - 这是怎么回事?

问题描述

想象一下我有以下数据框

import pandas as pd
import seaborn as sns
import numpy as np

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)

这将为我提供两个如下所示的数据框:

df =   
    val a
0    1  1
1    2  1
2    3  2
3    4  2

df2 =   
    val a
0    1  1
1    2  2

现在我想根据df中的val和a的值创建一个箱线图,即固定一个值a,即1;然后我有两个不同的值 val:1 和 2;然后根据值 {1,2} 在 x=1 创建一个框;然后转到 a=2:基于 a=2,我们有两个值 val={3,4},因此根据值 {3,4} 在 x=2 创建一个框;

然后我想简单地根据df2画一条线,其中a又是我的x轴,val是我的y轴;我这样做的方式如下

ax = df.boxplot(column=['val'], by = ['a'],meanline=True, showmeans=True, showcaps=True,showbox=True)
sns.pointplot(x='a', y='val', data=df2, ax=ax)

问题是 a=1 的框在 a=2 处移动,而 a=2 的框消失了;如果我的代码有错误或者是错误,我会感到困惑;

一个盒子不见了,盒子被移动了

如果我只是添加箱线图,一切都很好,所以如果我这样做:

ax = df.boxplot(column=['val'], by = ['a'],meanline=True, showmeans=True, showcaps=True,showbox=True)

正确的箱线图

这些框位于正确的位置,但是一旦我添加了点图,事情似乎就不再起作用了;

有人知道该怎么做吗?

标签: pythonpandasdataframe

解决方案


问题是您在 x 轴上绘制类别。Pointplot 在位置 0 绘制第一个项目,而 boxplot 从 1 开始,因此发生了移位。一种可能性是使用双轴:

ax = df.boxplot(column=['val'], by = ['a'])
ax2 = ax.twiny()
sns.pointplot(x='a', y='val', data=df2, ax=ax2)
ax2.xaxis.set_visible(False)

点图+箱线图


推荐阅读