在双胞胎图中组合两个数据框箱线图
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()
我想在一个图中显示两个 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()