如何使用Matplotlib subplot实现左计数图右饼图的双面板布局
原有代码的问题
- 子图网格参数逻辑混乱:左右排布两个图表对应1行2列的子图网格,原代码先后使用
2,1,1(对应2行1列上下布局的第一个位置)、2,2,1(对应2行2列布局的第一个位置)的参数,不符合左右排布的需求 - 轴对象绑定错误:初始创建的
ax1是单画布默认轴,后续调用countplot、pie方法时没有将绘图操作绑定到对应子图的轴对象上,会导致图表渲染位置错乱 - 存在冗余调用:最后一行
plt.subplot(2,2,1)没有绑定实际绘图逻辑,会额外生成空子图层,打乱整体布局
正确实现代码
import matplotlib.pyplot as plt import seaborn as sns import pandas as pd # --------------- 测试用示例数据,实际使用时替换为你自己的df即可 # df = pd.DataFrame({'data_si_o_no': [0]*820 + [1]*180}) # --------------- # 创建1行2列的子图布局,figsize可根据需要调整整体画布宽高 fig, (ax_count, ax_pie) = plt.subplots(nrows=1, ncols=2, figsize=(12, 5)) # 左侧绘制计数图,显式绑定到左轴 sns.countplot(x=df['data_si_o_no'], ax=ax_count) ax_count.set_xlabel('Disaster Tag') ax_count.set_ylabel('Sample Count') # 右侧绘制饼图,显式绑定到右轴 ax_pie.pie( df['data_si_o_no'].value_counts(), labels=['Not Disaster', 'Disaster'], autopct='%1.2f%%', shadow=True, explode=(0.05, 0), startangle=60 ) ax_pie.axis('equal') # 保证饼图显示为正圆形,不会被画布拉伸变形 # 设置总标题 fig.suptitle('Distribution of the data', fontsize=24) # 自动调整边距和子图间距,避免文字、图表重叠 plt.tight_layout() plt.show()
自定义配置说明
- 如果需要调整两个子图的宽度比例,可以在
plt.subplots()中添加参数gridspec_kw={'width_ratios': [1.2, 0.8]},数值越大对应位置的子图占比越宽 - 不需要保留测试数据段,直接传入你自己的DataFrame即可运行
- 可以通过
ax_count.set_title()、ax_pie.set_title()分别给两个子图加单独的标题
内容的提问来源于stack exchange,提问作者Rachele Franceschini
相关产品推荐
相关产品推荐

