如何基于多个DataFrame绘制仅共享Y轴的并排柱状图
解决方案
核心通过plt.subplots的sharey=True参数实现所有子图Y轴共享,同时将绘图配置统一管理,方便后续新增数据集。
完整可运行代码
from matplotlib import pyplot as plt import pandas as pd # 构造原始数据 fruits = {"Apple": 10, "Banana": 9, "Mango": 5, "Orange": 1} beverages = {"Coca-cola": 15, "Pepsi": 12, "Seven-up": 9, "Root-bear": 3} foods = {'hamburger': 10, 'pizza': 7, 'pasta': 5, 'sushi': 2} # 转换为DataFrame fruits_df = pd.DataFrame(fruits.items(), columns = ['stuffs', 'freq']) beverages_df = pd.DataFrame(beverages.items(), columns = ['stuffs', 'freq']) foods_df = pd.DataFrame(foods.items(), columns = ['stuffs', 'freq']) # 绘图配置统一管理:(DataFrame, 子图标题, 柱状图颜色) # 后续新增零食、服饰等类别,只需往该列表添加对应配置即可 plot_config = [ (fruits_df, 'fruits', '#1f77b4'), (beverages_df, 'beverages', '#ff7f0e'), (foods_df, 'foods', '#2ca02c') ] # 创建1行N列的子图,开启Y轴共享 fig, axes = plt.subplots(nrows=1, ncols=len(plot_config), figsize=(18, 6), sharey=True) # 循环绘制每个子图 for ax, (df, title, color) in zip(axes, plot_config): df.plot(x='stuffs', y='freq', kind='bar', ax=ax, legend=False, color=color) ax.set_title(title, fontsize=12) ax.tick_params(axis='x', rotation=45, labelright=False) ax.set_xlabel('') # 仅首个子图显示Y轴标签 axes[0].set_ylabel('freq', fontsize=12) # 自动调整布局避免标签重叠 plt.tight_layout() plt.show()
特性说明
- 自动对齐Y轴刻度,仅最左侧子图显示Y轴标签,完全匹配期望的仅共享Y轴并排布局
- 扩展性极强,后续新增类别无需修改绘图逻辑,只需构造好对应DataFrame,往
plot_config列表新增一条配置即可 - 所有子图样式统一管理,不会出现格式不一致的问题
内容的提问来源于stack exchange,提问作者Jang
相关产品推荐
相关产品推荐

