如何在Plotly Express热力图中添加次Y轴?含重复值处理
在Plotly Express热力图中实现双Y轴并处理重复轴标签
基础双Y轴实现
Plotly Express的imshow默认生成分类Y轴,要添加第二个Y轴,需手动创建右侧叠加轴,并将热力图的每行位置与第二个Y轴的刻度对应:
import plotly.express as px import plotly.graph_objects as go z = [[0.5,0.5],[1,1],[0.6,0.3],[1,0.4]] x = ["p1","p2"] y = ["A","B","C","D"] y2 = [1,2,3,4] # 生成初始热力图 fig = px.imshow(z, x=x, y=y, zmin=0, zmax=1) # 添加右侧第二个Y轴 fig.update_layout( yaxis2=dict( title="Y2轴", overlaying="y", side="right", # 手动指定刻度位置为热力图每行的索引(0到3) tickmode="array", tickvals=list(range(len(y))), # 对应索引设置Y2的刻度文本 ticktext=y2 ) ) fig.show()
处理Y2轴重复值的更优方案
当y2包含重复值时,若直接使用分类轴会导致重复值合并,无需修改原始数据为唯一标识,只需保持手动映射行索引到Y2值的方式即可保留所有原始标签:
import plotly.express as px import plotly.graph_objects as go z = [[0.5,0.5],[1,1],[0.6,0.3],[1,0.4]] x = ["p1","p2"] y = ["A","B","C","D"] y2 = [1,2,2,4] # 包含重复值 fig = px.imshow(z, x=x, y=y, zmin=0, zmax=1) fig.update_layout( yaxis2=dict( title="Y2轴", overlaying="y", side="right", tickmode="array", # 绑定热力图每行的索引位置 tickvals=list(range(len(y))), # 对应每个位置显示原始y2值,重复值不会合并 ticktext=y2, tickangle=0 # 可选:调整标签角度避免重叠 ) ) # 可选:统一Y轴范围,让刻度对齐更整齐 fig.update_yaxes(range=[-0.5, len(y)-0.5]) fig.show()
方案说明
- 热力图的每行对应一个索引(从下到上为0到
len(y)-1),通过tickvals绑定这些索引,ticktext映射为y2的原始值,即使值重复也会在对应行位置显示。 - 无需修改
y2的原始数据结构,完全保留业务含义,同时实现双Y轴的可视化需求。
内容的提问来源于stack exchange,提问作者Jean
相关产品推荐
相关产品推荐

