如何在Plotly行列分面图中实现每行列分面共用y轴、不同行y轴独立
Plotly分面图同行y轴共享、不同行y轴独立设置方案
核心逻辑
不需要全局取消所有y轴的匹配关系,仅需按行分组设置y轴匹配规则即可,避免全局matches=None导致同行y轴关联被清除的问题。
具体实现
固定行数场景(以2行分面为例)
直接逐行指定y轴匹配规则即可:
import plotly.express as px # 示例分面图创建:行分面、列分面同时存在 df = px.data.tips() fig = px.scatter(df, x="total_bill", y="tip", facet_row="time", facet_col="sex") # 第一行所有列的y轴匹配第一行第一列的y轴 fig.update_yaxes(matches="y", row=1) # 第二行所有列的y轴匹配第二行第一列的y轴,和第一行无关联 fig.update_yaxes(matches="y2", row=2) fig.show()
如果是用make_subplots手动创建的子图,设置规则完全一致:
from plotly.subplots import make_subplots import plotly.graph_objects as go # 创建2行3列子图 fig = make_subplots(rows=2, cols=3) # 此处省略添加trace的业务代码 # 同样按行设置y轴匹配规则 fig.update_yaxes(matches="y", row=1) fig.update_yaxes(matches="y2", row=2)
行数不固定通用方案
如果分面行数是动态生成的,可通过循环自动适配:
# 自动获取分面总行数 total_rows = max(fig._get_subplot_rows()) for row_idx in range(1, total_rows + 1): match_target = f"y{row_idx}" if row_idx > 1 else "y" # 逐行设置该行所有y轴匹配当前行第一个子图的y轴 fig.update_yaxes(matches=match_target, row=row_idx)
实现效果
设置完成后,同一行内所有列分面的y轴量程完全一致,可正常进行横向对比;不同行的y轴会独立适配对应行的数据范围,不会互相干扰。
之前出现问题是因为全局调用fig.update_yaxes(matches=None)清除了所有y轴的匹配关联,导致同行、跨行的y轴都完全独立,按上述方案按行分组设置匹配规则即可解决。

内容的提问来源于stack exchange,提问作者caracter2
相关产品推荐
相关产品推荐

