如何将两个Pandas箱线图并排展示?或按变量分组对比?
问题解答
不需要额外找其他Python库,用Pandas结合Matplotlib就能实现你要的两种效果——毕竟Pandas的绘图功能本身就是基于Matplotlib实现的,之前只显示第二幅图是因为默认每次调用boxplot()都会新建画布,覆盖了之前的内容。
方案一:两幅箱线图并排展示
通过Matplotlib创建多子图布局,分别在不同子图中绘制两个数据框的箱线图:
import matplotlib.pyplot as plt import pandas as pd # 假设df1、df2是你的目标数据框 fig, (ax1, ax2) = plt.subplots(ncols=2, figsize=(12, 6)) # 在第一个子图绘制df1的箱线图 df1.boxplot(ax=ax1) ax1.set_title('df1 变量箱线图') ax1.tick_params(axis='x', rotation=45) # 旋转x轴标签避免重叠 # 在第二个子图绘制df2的箱线图 df2.boxplot(ax=ax2) ax2.set_title('df2 变量箱线图') ax2.tick_params(axis='x', rotation=45) plt.tight_layout() # 自动调整子图间距 plt.show()
方案二:每个变量单独对比(10幅图,每幅含两个数据框的对应变量箱线图)
循环遍历每个变量,将两个数据框的对应变量数据合并后绘制对比箱线图,你可以选择一次性展示所有对比图,或者逐个生成:
一次性展示所有10个对比图
import matplotlib.pyplot as plt import pandas as pd variables = df1.columns.tolist() # 创建2行5列的子图布局(适配10个变量) fig, axes = plt.subplots(nrows=2, ncols=5, figsize=(15, 8)) axes = axes.flatten() # 把二维子图数组转为一维,方便循环遍历 for idx, var in enumerate(variables): # 合并两个数据框的当前变量数据 combined_data = pd.DataFrame({ 'df1': df1[var], 'df2': df2[var] }) # 在对应子图绘制对比箱线图 combined_data.boxplot(ax=axes[idx]) axes[idx].set_title(f'变量 {var} 对比') plt.tight_layout() plt.show()
逐个生成并展示对比图
如果不想一次性展示所有图,也可以循环中单独创建画布:
import matplotlib.pyplot as plt import pandas as pd variables = df1.columns.tolist() for var in variables: combined_data = pd.DataFrame({ 'df1': df1[var], 'df2': df2[var] }) combined_data.boxplot() plt.title(f'变量 {var} 对比') plt.show()
内容的提问来源于stack exchange,提问作者Emily
相关产品推荐
相关产品推荐

