在双胞胎图中组合两个数据框箱线图

Combine two dataframe boxplots in a twinx figure

我想在一个图中显示两个 Pandas 数据框作为箱线图。 由于两个数据帧中的每一个都有不同的值范围,我想将它们组合成一个双胞胎数字。

减少到最低限度,我尝试了以下方法:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

df1 = pd.DataFrame(np.random.randint(0,100,size=(100, 4)), columns=list('ABCD'))

df2 = pd.DataFrame(np.random.randint(100,200,size=(100, 2)), columns=list('EF'))

fig, ax1 = plt.subplots()
ax2 = ax1.twinx()

df1.boxplot(ax=ax1)
df2.boxplot(ax=ax2)

plt.show()

结果不是预期的样子(实际上应该有 6 个方框!)

如何让箱线图彼此相邻? 我试图在 ax1 和 ax2 上设置一些虚拟散点,但这并没有真正帮助。

最好的解决方案是连接数据帧以进行绘图并使用遮罩。在创建掩码时,我们使用 dfs == dfs | dfs.isnull() 创建一个带有 True 的完整矩阵,然后我们查询所有不是 'E''F' 的列名。这给出了一个 2D 矩阵,允许您只绘制前四个框,因为最后两个框被屏蔽了(因此它们的刻度确实出现在底部)。使用反向掩码 ~mask,您可以在自己的轴上绘制最后两个并屏蔽前四个。

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

df1 = pd.DataFrame(np.random.randint(  0,100,size=(100, 4)), columns=list('ABCD'))
df2 = pd.DataFrame(np.random.randint(100,200,size=(100, 2)), columns=list('EF'  ))

dfs = pd.concat([df1, df2])
mask = ((dfs == dfs) | dfs.isnull()) & (dfs.columns != 'E') & (dfs.columns != 'F')

fig, ax1 = plt.subplots()
dfs[mask].boxplot()

ax2 = ax1.twinx()
dfs[~mask].boxplot()

plt.show()