如何用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")
错误原因
plt.show()时机错误:一旦调用plt.show(),当前绘图的渲染流程就已完成,在Jupyter环境中还会释放当前Figure资源,后续对ax的修改无法再反映到原图表上。- Pandas绘图的索引问题:
df.iloc[5:]的原始索引是5-9,但Pandas的plot(kind='bar')默认会将切片后的数据集的x轴坐标重置为0-4,导致后5个柱形直接覆盖在前5个的位置上,所以保存的图只显示最后绘制的灰色柱形。 - 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
相关产品推荐
相关产品推荐

