【问题标题】:Weird shifting of boxplot in pandas boxplot combining it with seaborn pointplot - what is going on?pandas boxplot 中 boxplot 的奇怪变化将其与 seaborn pointplot 相结合 - 这是怎么回事?
【发布时间】:2021-08-31 20:40:48
【问题描述】:

假设我有以下数据框

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)

盒子在正确的位置,但是一旦我添加了点图,事情似乎不再起作用了;

有人知道该怎么做吗?

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    问题是您在 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)
    

    【讨论】:

    • 太棒了 - 但你能向我解释一下为什么这有效吗?在我的情况下,我使用原始轴 ax,在你的情况下,我制作轴的副本并使用副本;我觉得结果应该是一样的......
    • 两个轴显示不同的xlim,检查ax.get_xlim() vs ax2.get_xlim() ;)
    猜你喜欢
    • 1970-01-01
    • 2017-07-15
    • 1970-01-01
    • 1970-01-01
    • 2023-03-13
    • 2021-10-29
    • 1970-01-01
    • 2015-02-27
    • 2018-12-08
    相关资源
    最近更新 更多