为什么DataFrame绘制柱状图刻度合并,行绘制正常且如何自定义柱子颜色
直接绘制整个DataFrame出现异常的原因
- 双图问题:你手动调用
plt.subplots()创建了画布和轴对象,但调用df.plot()时没有传入ax=ax参数指定绘图轴,pandas会自动创建新的画布和轴进行绘图,因此会出现两个图表,手动创建的那个没有绘图内容,显示为空。 - 柱子集中在同一刻度问题:DataFrame的柱状图默认逻辑是行作为X轴的分组维度,列作为同分组下的不同系列。你的DataFrame只有1行,所以X轴只有1个分组刻度,所有列的柱子都会集中在这一个刻度下,和你要的「每个列对应一个X轴刻度」的需求不符。
实现需求的两种方案
方案1:基于单行Series绘图,传入颜色列表
Series.plot的color参数支持传入和柱子数量等长的颜色列表,遍历索引生成对应颜色即可实现单独修改Total柱子的颜色:
import pandas as pd import matplotlib.pyplot as plt data = {"Small-Mid":367, "Large":0, "XXL":0, "FF":328, "AA":0, "Total":695} df = pd.DataFrame([data], columns=data.keys()) fig, ax = plt.subplots(figsize=(11.96, 4.42)) row = df.iloc[0] # 生成颜色列表:非Total列用默认蓝色,Total列可自定义为其他颜色 colors = ['#1f77b4' if col != 'Total' else '#ff7f0e' for col in row.index] row.plot(kind='bar', color=colors, ax=ax) plt.show()
方案2:转置DataFrame后绘图
如果你要基于DataFrame绘图,可以先把DataFrame转置,让列名变成索引,每一行对应原来的一列数据,绘图时X轴就会自动对应每个类别:
import pandas as pd import matplotlib.pyplot as plt data = {"Small-Mid":367, "Large":0, "XXL":0, "FF":328, "AA":0, "Total":695} df = pd.DataFrame([data], columns=data.keys()) fig, ax = plt.subplots(figsize=(11.96, 4.42)) colors = ['#1f77b4' if col != 'Total' else '#ff7f0e' for col in df.columns] # 转置后绘图,关闭不需要的图例 df.T.plot(kind='bar', color=colors, ax=ax, legend=False) plt.show()
两种方案都可以正常显示图表,且单独修改Total柱子的颜色,可根据使用习惯选择。
内容的提问来源于stack exchange,提问作者Mary
相关产品推荐
相关产品推荐

