You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Matplotlib绘制Pandas DataFrame的双色单幅柱状图?

如何在同一柱状图中为前5个和后5个柱形设置不同颜色?

问题重现

你尝试给DataFrame的前5个值绘制蓝色柱形,后5个绘制红色柱形,但执行plt.show()后再添加后续柱形无效,保存的图只显示后5个柱形。你的代码如下:

import matplotlib.pyplot as plt
import pandas as pd

df = pd.DataFrame({"x": range(10)})

ax = df.iloc[:5].plot(kind="bar", color="blue")
plt.show()

df.iloc[5:].plot(kind="bar", color="grey", ax=ax)
ax.bar(df.index[5:].values, df.iloc[5:, 0].values, color="grey")

错误原因

  1. plt.show()时机错误:一旦调用plt.show(),当前绘图的渲染流程就已完成,在Jupyter环境中还会释放当前Figure资源,后续对ax的修改无法再反映到原图表上。
  2. Pandas绘图的索引问题:df.iloc[5:]的原始索引是5-9,但Pandas的plot(kind='bar')默认会将切片后的数据集的x轴坐标重置为0-4,导致后5个柱形直接覆盖在前5个的位置上,所以保存的图只显示最后绘制的灰色柱形。
  3. Matplotlib bar的x轴范围问题:用ax.bar指定x为5-9时,原图表的x轴范围仅包含0-4,这些柱形超出了显示范围,自然看不到。

正确解决方案

方法1:一次性指定颜色列表(最简洁)

直接创建对应长度的颜色列表,一次性绘制所有柱形:

import matplotlib.pyplot as plt
import pandas as pd

df = pd.DataFrame({"x": range(10)})
# 前5个蓝色,后5个红色
color_list = ['blue'] * 5 + ['red'] * 5

ax = df.plot(kind='bar', color=color_list)
plt.show()
ax.figure.savefig("fig.png")

方法2:分两次绘制(不提前调用plt.show())

先创建空的绘图对象,再分别绘制前后部分,确保x轴位置正确:

import matplotlib.pyplot as plt
import pandas as pd

df = pd.DataFrame({"x": range(10)})
fig, ax = plt.subplots()

# 绘制前5个,使用原索引作为x轴位置
df.iloc[:5].plot(kind='bar', color='blue', ax=ax)
# 绘制后5个,同样使用原索引,避免覆盖
ax.bar(df.index[5:], df['x'].iloc[5:], color='red')

plt.show()
ax.figure.savefig("fig.png")

内容的提问来源于stack exchange,提问作者daniel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 10:25:17