如何在Plotly中上下组合imshow与Scattergl图表?
如何组合Plotly的px.imshow热力图与go.Scattergl折线图?
我需要将两个Plotly图表(px.imshow生成的热力图与go.Scattergl生成的折线图)上下组合展示,单独绘制时两者均正常:
单独图表代码
imshow热力图
from plotly.subplots import make_subplots import plotly.express as px import plotly.graph_objects as go fig = px.imshow(distances, color_continuous_scale='RdBu_r', origin='lower', aspect='auto', height=300) fig.update_xaxes(showticklabels=False) fig.update_yaxes(showticklabels=False)
Scattergl折线图
fig = go.Figure(data=go.Scattergl( x=ds['x'], y=ds['y'], mode='lines' ))
我期望组合成上下布局的样式,但尝试的子图代码存在问题:
尝试的问题代码
fig = make_subplots(rows=2, cols=1) fig1 = fig.add_image(z=distances,row=1, col=1) fig1.update_layout(coloraxis_showscale=True) fig1.update_xaxes(showticklabels=False) fig1.update_yaxes(showticklabels=False) fig2 = fig.add_scattergl(x=df['x'],y=df['y'],mode='lines',row=2, col=1) fig2.update_xaxes(showticklabels=True) fig2.update_yaxes(showticklabels=True)
存在的问题
- 调用
fig2.update_xaxes等方法时,fig1的轴设置也会被影响 - 第一个图表无法正常显示,也无法展示色阶
核心问题是不知道如何用子图API复现px.imshow的功能,请问如何正确组合这两个图表?
正确解决方案
核心思路
px.imshow本质是生成了Heatmap类型的trace,而非Image,所以不能用add_image,应该通过add_trace将px.imshow生成的trace导入子图,同时指定对应的行列;另外更新轴设置时要明确指定row和col,避免全局影响。
完整代码
from plotly.subplots import make_subplots import plotly.express as px import plotly.graph_objects as go # 创建2行1列的子图 fig = make_subplots(rows=2, cols=1, vertical_spacing=0.1) # 生成imshow热力图并获取其trace imshow_fig = px.imshow(distances, color_continuous_scale='RdBu_r', origin='lower', aspect='auto') # 将热力图trace添加到子图第1行 fig.add_trace(imshow_fig.data[0], row=1, col=1) # 添加Scattergl折线图到子图第2行 fig.add_trace(go.Scattergl( x=df['x'], y=df['y'], mode='lines' ), row=2, col=1) # 单独设置第1行的轴:隐藏刻度标签 fig.update_xaxes(showticklabels=False, row=1, col=1) fig.update_yaxes(showticklabels=False, row=1, col=1) # 单独设置第2行的轴:显示刻度标签 fig.update_xaxes(showticklabels=True, row=2, col=1) fig.update_yaxes(showticklabels=True, row=2, col=1) # 保留热力图的色阶设置 fig.update_layout( coloraxis=imshow_fig.layout.coloraxis, height=600 # 调整整体高度适配两个子图 ) fig.show()
代码说明
- 导入px.imshow的trace:通过
imshow_fig.data[0]获取px.imshow生成的Heatmap trace,用add_trace添加到子图指定位置,完美复现原热力图的样式和色阶。 - 精准控制轴设置:更新轴时通过
row和col参数指定目标子图,避免不同子图的轴设置互相干扰。 - 继承色阶配置:将原imshow图的
coloraxis配置复制到子图布局中,确保色阶正常显示。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

