如何在Python Plotly中制作按正负值渐变着色的Treemap图表
Plotly Treemap 按正负值动态着色实现方案
核心思路
通过自定义颜色刻度(color_continuous_scale),将open_pl字段的负值映射到红色渐变系、正值映射到绿色渐变系,同时设置颜色中点为0,确保数值正负程度对应颜色深浅变化。
代码实现(Plotly Express)
import plotly.express as px import pandas as pd # 替换为你的业务数据 data = pd.DataFrame({ 'category': ['A', 'B', 'C', 'D', 'E', 'F'], 'value': [10, 20, 15, 25, 30, 18], 'open_pl': [50, -30, 20, -40, 60, -10] }) # 自定义颜色刻度:负值从深红到浅红,正值从浅绿到深绿 color_scale = [ [0.0, '#8B0000'], # 最小负值(最深红) [0.25, '#DC143C'], # 中等负值(浅红) [0.5, '#FFFFFF'], # 0值(白色过渡) [0.75, '#32CD32'], # 中等正值(浅绿) [1.0, '#006400'] # 最大正值(最深绿) ] # 生成Treemap并应用着色逻辑 fig = px.treemap( data, path=['category'], values='value', color='open_pl', color_continuous_scale=color_scale, color_continuous_midpoint=0 # 强制颜色中点为0,区分正负区间 ) # 优化颜色条显示 fig.update_layout( coloraxis_colorbar=dict( title='Open P&L', ticks='outside', tickvals=[data['open_pl'].min(), 0, data['open_pl'].max()], ticktext=[f"{data['open_pl'].min()}", '0', f"{data['open_pl'].max()}"] ) ) fig.show()
无白色过渡的版本(可选)
如果不需要0值处的白色断层,可调整颜色刻度,让正负区间直接衔接:
color_scale = [ [0.0, '#8B0000'], [0.49, '#FF6347'], # 接近0的负值(浅红) [0.51, '#90EE90'], # 接近0的正值(浅绿) [1.0, '#006400'] ]
代码实现(Plotly Graph Objects)
若使用底层Graph Objects库,逻辑一致:
import plotly.graph_objects as go fig = go.Figure(go.Treemap( labels=data['category'], parents=['']*len(data), # 顶级节点无父类 values=data['value'], marker=dict( colors=data['open_pl'], colorscale=color_scale, cmid=0, # 颜色中点设为0 colorbar=dict( title='Open P&L', tickvals=[data['open_pl'].min(), 0, data['open_pl'].max()], ticktext=[f"{data['open_pl'].min()}", '0', f"{data['open_pl'].max()}"] ) ) )) fig.show()
关键参数说明
color='open_pl':指定以open_pl字段作为颜色映射的数据源color_continuous_midpoint=0:将颜色刻度的中点强制设为0,确保负值和正值分别对应红色系和绿色系color_continuous_scale:自定义颜色渐变规则,通过分位值(0到1)对应具体颜色,实现深浅随数值变化
内容的提问来源于stack exchange,提问作者Suwaid Aslam
相关产品推荐
相关产品推荐

