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

Matplotlib如何仅为特定列/单元格应用cellColours着色规则

解决方案

以下是两种可直接落地的实现方案,均可以满足仅指定列着色、字符串列保持白色的需求:

方案1:预构造全量颜色数组传入

这种方式直接匹配cellColours参数的输入要求,不需要额外修改表格属性,代码改动最小:
核心逻辑:先创建和表格单元格维度完全一致的全白颜色数组,仅将数值列对应位置替换为自定义colormap生成的颜色,再整体传入参数即可。
修改后的完整代码如下:

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

# 构造测试数据,新增需要的字符串列
idx = pd.Index(np.arange(1,6))
df = pd.DataFrame(abs(2*np.random.randn(5, 5)), index=idx, columns=['A', 'B', 'C', 'D', 'E'])
# 新增第一列字符串指标列
metric = ['MBIAS', 'RMSE', 'BAGSS', 'MBIAS', 'MBIAS']
df.insert(0, 'Metric', metric)
# 新增最后一列模型字符串列
model = ['conusarw', 'conusarw', 'conusarw', 'nam04', 'emhrrr']
df['Model'] = model

# 提取数值列做归一化和颜色映射
num_cols = ['A','B','C','D','E']
test = df[num_cols].round(2)
vals = test.values
norm = matplotlib.colors.TwoSlopeNorm(vmin=0,vcenter=1,vmax=10)
num_colours = plt.cm.coolwarm(norm(vals))

# 构造全量颜色数组:所有单元格默认白色
full_colours = np.full((len(df), len(df.columns)), fill_value='white', dtype=object)
# 仅替换数值列(第2到第6列,对应索引1到5)的颜色
full_colours[:, 1:6] = num_colours

# 绘图生成表格
fig = plt.figure(figsize=(15,8))
ax = fig.add_subplot(111, frameon=False, xticks=[], yticks=[])
the_table=plt.table(
    cellText=df.values, 
    colLabels=df.columns,
    rowLabels=model,
    loc='center', 
    cellColours=full_colours
)

plt.savefig('test_table.png')

方案2:生成表格后遍历单元格着色

这种方式灵活性更高,支持按任意规则(指定行、列、单个单元格)设置颜色,适合着色规则复杂的场景:
核心逻辑:先生成无着色的基础表格,通过the_table.get_celld()获取所有单元格对象,按坐标定位目标单元格后单独设置背景色。
示例代码片段如下(替换上述代码中表格生成部分即可):

# 先生成无着色的基础表格
fig = plt.figure(figsize=(15,8))
ax = fig.add_subplot(111, frameon=False, xticks=[], yticks=[])
the_table=plt.table(
    cellText=df.values, 
    colLabels=df.columns,
    rowLabels=model,
    loc='center'
)

# 遍历数值列的所有数据单元格设置颜色
# 注意:matplotlib表格坐标规则为(行号, 列号),行号0为表头行,数据行从1开始
for row_idx in range(1, len(df)+1):
    for col_idx in range(1,6): # 对应第2到6列
        # 取对应数值做颜色映射
        val = vals[row_idx-1, col_idx-1]
        cell_color = plt.cm.coolwarm(norm(val))
        # 获取单元格对象设置背景色
        cell = the_table[(row_idx, col_idx)]
        cell.set_facecolor(cell_color)

plt.savefig('test_table.png')

关键注意点

  1. 直接使用cellColours参数时,颜色数组的维度必须和cellText的维度(行数×列数)完全匹配,否则会触发维度不匹配报错
  2. 如果需要单独调整表头、行标签的样式,也可以通过遍历单元格坐标的方式单独设置

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 23:18:01