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
相关产品推荐
相关产品推荐

