You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将Plotly分面子图的标题与子图窗口左侧对齐?

解决Plotly Express Facet Wrap子图标题左对齐问题

你直接设置x=0无效的原因是:facet子图的标题注释默认使用全局画布(paper)坐标系统,设置x=0会把所有标题都移到整个图表的最左侧,而非对应子图的左侧。

正确解决方案

需要将每个子图标题的x坐标绑定到对应子图的左边界,并设置左对齐锚点。以下是实现代码:

import plotly.express as px

# 示例数据
df = px.data.tips()

# 绘制facet_wrap分组柱状图
fig = px.bar(df, x="day", y="total_bill", facet_col="sex", facet_wrap="smoker")

# 遍历每个子图标题注释,设置左对齐
for idx, anno in enumerate(fig.layout.annotations):
    # 获取对应子图的X轴对象(第一个子图是xaxis,后续是xaxis2、xaxis3...)
    x_axis_key = "xaxis" if idx == 0 else f"xaxis{idx+1}"
    subplot_xaxis = fig.layout[x_axis_key]
    
    # 将注释的X坐标设为子图的左边界,设置左对齐锚点
    anno.update(
        x=subplot_xaxis.domain[0],
        xanchor="left"
    )

fig.show()

关键逻辑说明

  • fig.layout.annotations:包含所有facet子图的标题注释对象
  • subplot_xaxis.domain[0]:获取对应子图在全局画布上的左边界坐标(paper坐标系统,范围0到1)
  • xanchor="left":让注释文本的左边缘对齐到设置的X坐标位置,实现子图窗口左侧对齐

替代简洁写法

如果想要更紧凑的代码,可以结合for_each_annotation和子图索引映射:

fig.for_each_annotation(lambda a, idx: a.update(
    x=fig.layout[f"xaxis{'' if idx==0 else idx+1}"].domain[0],
    xanchor="left"
), enumerate(fig.layout.annotations))

内容的提问来源于stack exchange,提问作者Tyler Rinker

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 15:57:41