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

Python中如何为Pandas DataFrame条形图的单个条形自定义颜色?

Pandas横向条形图修改单个条形颜色的解决方案

初始代码

用户原本用于绘制横向条形图的代码:

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np

df = pd.DataFrame({"first":np.arange(1,6), "second":np.arange(2,7)}) 
df.plot(kind="barh", color=tuple(["g", "b"]))

需求与问题

希望将df.loc[0,"first"]对应的最短绿色条形修改为自定义颜色#af12be22,最初期望通过给plot方法的color参数传入颜色DataFrame来控制每个单元格的条形颜色,示例代码如下:

df = pd.DataFrame({"first":np.arange(1,6), "second":np.arange(2,7)}) 
df_colors = pd.DataFrame({"first":["#af12be22"] + 4*["g"], "second":5*["b"]})  
df.plot(kind="barh", color=df_colors)

但查阅Pandas官方文档后发现,color参数仅支持设置列间的颜色差异,无法控制列内单个条形的颜色。尝试将df_colors转为NumPy数组或列表时,触发如下错误:

ValueError: Invalid color ['#af12be22' 'g' 'g' 'g' 'g']

简便解决方法

Pandas的plot方法基于Matplotlib实现,因此可以直接获取绘图返回的Axes对象,手动修改对应条形的颜色:

单个条形修改

如果只需要修改特定单个条形,直接定位对应的patch对象即可:

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np

df = pd.DataFrame({"first":np.arange(1,6), "second":np.arange(2,7)}) 
# 绘图并获取Axes实例
ax = df.plot(kind="barh", color=tuple(["g", "b"]))

# 横向条形图中,patches的顺序为:first列第0行 → first列第1行 → ... → first列第4行 → second列第0行 → ... → second列第4行
# 定位first列第0行的条形并修改颜色
ax.patches[0].set_facecolor("#af12be22")

plt.show()

批量按DataFrame控制颜色

如果需要按照预设的颜色DataFrame批量修改所有条形颜色,可以通过遍历patches并匹配行列索引实现:

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np

df = pd.DataFrame({"first":np.arange(1,6), "second":np.arange(2,7)}) 
df_colors = pd.DataFrame({"first":["#af12be22"] + 4*["g"], "second":5*["b"]})  

ax = df.plot(kind="barh", color=tuple(["g", "b"]))

patch_index = 0
# 按列、按行遍历DataFrame,对应修改每个条形颜色
for column in df.columns:
    for row_idx in df.index:
        ax.patches[patch_index].set_facecolor(df_colors.loc[row_idx, column])
        patch_index += 1

plt.show()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 08:05:23