df.plot.bar() 用于短标签纵向柱状图,df.plot.barh() 适合中文长标签横向展示,避免重叠;barh() 中 x 为类别、y 为数值,stacked=True 实现水平堆叠,多行数据时可读性更优。

df.plot.bar() 和 df.plot.barh() 怎么选
横向还是纵向,取决于类别标签长度和阅读习惯。如果 Field 或 Name 是中文长文本(比如“人工智能算法工程师”),用 plot.barh() 更省空间,避免标签重叠或旋转失效;反之,年份、季度等短标签用 plot.bar() 更符合直觉。
注意:barh() 的 x 参数对应横轴(即类别),y 对应数值列列表——这点和 bar() 一致,但初学者常误把 y 当成纵坐标轴名而报错 KeyError。
- 横向图默认不自动旋转标签,需手动加
plt.xticks(rotation=45)或用ax.set_xticklabels(..., rotation=45) -
barh()中的stacked=True依然生效,堆叠方向是水平延伸(从左到右累加) - 若数据行数多(>20),
barh()可读性显著优于bar(),尤其配合sort_values()排序后
分组柱状图 vs 堆叠柱状图:参数和语义区别
分组(并列)和堆叠本质是两种分析逻辑:分组用于对比同类别下各指标大小(如“每个城市中男/女数量”),堆叠用于看整体构成(如“每个城市总人口中男女占比”)。Pandas 里只差一个参数,但意义完全不同。
- 分组图:直接传入多列,如
df[['Age', 'Score']].plot.bar()—— 默认并列,每组两个柱子 - 堆叠图:加
stacked=True,如df[['Oct', 'Nov', 'Dec']].plot.bar(stacked=True)—— 每个横坐标位置只出一个柱子,内部按列分段 - 别用
subplots=True混淆概念:那是为每列单独画一张子图,不是分组,也不共享坐标轴 - 堆叠时若含负值,Pandas 会自动上下双向堆叠(正数向上、负数向下),但容易造成视觉误导,建议提前检查
df.min(numeric_only=True)
中文标签显示不全或方块乱码怎么办
这不是 Pandas 的问题,是 Matplotlib 缺少中文字体支持。Pandas 的 .plot() 底层调用 Matplotlib,所以必须在绘图前设置字体,且不能只靠 plt.xlabel(..., fontproperties='SimHei') 局部覆盖——那样标题、图例、刻度仍可能乱码。
- 推荐做法:全局设置
mpl.rcParams['font.sans-serif'] = ['SimHei', 'Arial Unicode MS'],并关闭字体查找缓存(mpl.rcParams['axes.unicode_minus'] = False防止负号变方块) - Windows 下
'SimHei'通常可用;Mac 用户改用'Heiti SC';Linux 可装fonts-wqy-zenhei后填'WenQuanYi Zen Hei' - 绕过字体配置的临时方案:用英文列名 + 图例说明,例如列名设为
'sales_2023',再用plt.legend(['销售额2023'])
排序+颜色+图例这些细节怎么不翻车
真实场景中,柱状图常需按某列排序、指定颜色、调整图例位置——但顺序错了就会白忙活。关键点在于:排序必须在绘图前完成,且影响的是 DataFrame 行序;颜色按列顺序匹配,不是按原始列名字母序。
- 排序:用
df.sort_values(by='Total', inplace=True),之后再调plot.bar(),否则图表仍是原始顺序 - 颜色:传入
color=['#1f77b4', '#ff7f0e']时,第一个色对应y列表里的第一项(如['Oct', 'Nov']中的Oct) - 图例位置:默认在右上,拥挤时加
plt.legend(loc='lower right')或bbox_to_anchor=(1.05, 1)外置 - 横坐标标签太挤?别硬调
rotation=90,它在barh()下无效;改用ax.set_yticklabels(df['Name'], rotation=0)(对barh是 y 轴)
最容易被忽略的是:绘图后修改坐标轴标签,必须用 plt.gca() 获取当前轴对象,而不是新建一个 plt.subplot()——后者会覆盖原图,导致柱子还在但标签消失。










