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

Plotly子图表格中基于列最值的条件格式数据条实现求助

解决Plotly子图表格添加基于列极值的Data Bars问题

核心思路

Plotly表格可通过单元格背景的CSS线性渐变或颜色映射实现基于列内最小值/最大值的Data Bars效果,以下是具体实现方案:


完整代码示例

1. 导入依赖与准备样例数据

import plotly.graph_objects as go
from plotly.subplots import make_subplots
import pandas as pd

# 模拟4个表格的样例数据
df1 = pd.DataFrame({'指标1': [12, 28, 19], '数值1': [5, 17, 11]})
df2 = pd.DataFrame({'指标2': [100, 220, 180], '数值2': [60, 190, 130]})
df3 = pd.DataFrame({'指标3': [0.2, 0.7, 0.4], '数值3': [0.3, 0.8, 0.5]})
df4 = pd.DataFrame({'指标4': [3, 7, 5], '数值4': [2, 6, 4]})

2. 编写Data Bars生成函数

该函数根据列内数据的相对占比,生成对应宽度的背景渐变样式:

def generate_data_bars(column_data, bar_color="rgba(50, 171, 96, 0.6)"):
    min_val = column_data.min()
    max_val = column_data.max()
    # 处理列内值全相同的情况,避免除以0
    if max_val == min_val:
        return [f"linear-gradient(90deg, {bar_color} 50%, transparent 50%)" for _ in column_data]
    # 计算每个值的相对占比
    ratios = (column_data - min_val) / (max_val - min_val)
    # 生成线性渐变背景
    return [f"linear-gradient(90deg, {bar_color} {r*100}%, transparent {r*100}%)" for r in ratios]

3. 创建子图并添加带Data Bars的表格

# 初始化2x2子图框架
fig = make_subplots(
    rows=2, cols=2,
    subplot_titles=("表格1", "表格2", "表格3", "表格4"),
    specs=[[{"type": "table"}, {"type": "table"}],
           [{"type": "table"}, {"type": "table"}]]
)

# 逐个添加表格,为指定列设置Data Bars
# 表格1:为「数值1」列添加绿色Data Bars
fig.add_trace(go.Table(
    header=dict(values=list(df1.columns), fill_color='paleturquoise', align='left'),
    cells=dict(values=[df1['指标1'], df1['数值1']],
               fill_color=['white', generate_data_bars(df1['数值1'])],
               align='left')),
    row=1, col=1)

# 表格2:为「数值2」列添加红色Data Bars
fig.add_trace(go.Table(
    header=dict(values=list(df2.columns), fill_color='paleturquoise', align='left'),
    cells=dict(values=[df2['指标2'], df2['数值2']],
               fill_color=['white', generate_data_bars(df2['数值2'], "rgba(219, 64, 82, 0.6)")],
               align='left')),
    row=1, col=2)

# 表格3:为「数值3」列添加蓝色Data Bars
fig.add_trace(go.Table(
    header=dict(values=list(df3.columns), fill_color='paleturquoise', align='left'),
    cells=dict(values=[df3['指标3'], df3['数值3']],
               fill_color=['white', generate_data_bars(df3['数值3'], "rgba(50, 130, 184, 0.6)")],
               align='left')),
    row=2, col=1)

# 表格4:为「数值4」列添加橙色Data Bars
fig.add_trace(go.Table(
    header=dict(values=list(df4.columns), fill_color='paleturquoise', align='left'),
    cells=dict(values=[df4['指标4'], df4['数值4']],
               fill_color=['white', generate_data_bars(df4['数值4'], "rgba(255, 165, 0, 0.6)")],
               align='left')),
    row=2, col=2)

# 调整布局
fig.update_layout(height=800, width=1000, title_text="基于列极值的Data Bars多表格")
fig.show()

关键说明

  • 若需要颜色渐变填充(而非条形填充),可替换generate_data_bars函数为颜色映射逻辑:
    from plotly.colors import sample_colorscale
    def generate_gradient_colors(column_data, colorscale="RdYlGn"):
        min_val = column_data.min()
        max_val = column_data.max()
        ratios = (column_data - min_val)/(max_val - min_val) if max_val != min_val else [0.5]*len(column_data)
        return sample_colorscale(colorscale, ratios)
    
    调用时直接将fill_color对应列替换为该函数返回值即可。
  • 必须处理列内所有值相等的情况,避免出现除以0的报错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 07:12:52