使用Matplotlib绘制Pandas多列数据时颜色列表传参报错求助
解决Matplotlib传递颜色列表时的"Invalid RGBA argument"错误
你在尝试用pandas多列数据绘制柱状图时踩了颜色参数的坑~我来帮你搞定这个问题。
错误原因分析
你遇到的Invalid RGBA argument错误,本质是颜色列表的维度和matplotlib预期不匹配:ax.bar()的color参数要么接受单个颜色值(给所有柱子用同一种颜色),要么接受和单组柱子数量一致的颜色列表。如果直接把多列数据丢给ax.bar(),同时传递和列数匹配的颜色列表,matplotlib会把所有柱子(行数×列数)当成一组,这时候颜色列表长度不够,就会触发报错。
修复后的代码示例
下面分两种常见场景给出正确写法:
场景1:分组柱状图
如果想把每列数据作为一组并排展示:
import pandas as pd from matplotlib import pyplot as plt df = pd.DataFrame({'0':[0,1,0],'a':[1,2,3],'b':[2,4,6],'c':[5,3,1]}) colors = ['r','g','b'] fig, ax = plt.subplots() bar_width = 0.25 # 每组柱子的宽度 x = df.index.values # 循环遍历每一列,给每列分配对应颜色 for idx, col in enumerate(['a', 'b', 'c']): ax.bar(x + idx*bar_width, df[col], width=bar_width, color=colors[idx], label=col) # 设置x轴刻度和图例 ax.set_xticks(x + bar_width) ax.set_xticklabels(x) ax.legend() plt.show()
场景2:堆叠柱状图
如果想把每列数据堆叠在一起展示:
import pandas as pd from matplotlib import pyplot as plt df = pd.DataFrame({'0':[0,1,0],'a':[1,2,3],'b':[2,4,6],'c':[5,3,1]}) colors = ['r','g','b'] fig, ax = plt.subplots() bottom_data = None # 记录上一层柱子的高度,用于堆叠 for idx, col in enumerate(['a', 'b', 'c']): ax.bar(df.index.values, df[col], bottom=bottom_data, color=colors[idx], label=col) # 更新堆叠的底部高度 if bottom_data is None: bottom_data = df[col] else: bottom_data += df[col] ax.legend() plt.show()
核心思路总结
- 不要一次性给
ax.bar()传递多列数据,而是每列单独调用一次ax.bar() - 每次调用时,从颜色列表中取对应位置的单个颜色值传递给
color参数 - 分组图通过调整x轴位置实现,堆叠图通过
bottom参数控制层级
内容的提问来源于stack exchange,提问作者NicoH
相关产品推荐
相关产品推荐

