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

确保Plotly Express极坐标条形图子图格式一致

确保Plotly Express极坐标条形图子图格式一致

我太懂你这个困扰了——用Plotly Express生成多个极坐标条形图再组合成子图时,明明每个单独的图都设置好了方向、刻度,结果组合到一起就乱了,用fig.update_layout直接改还没效果,对吧?其实问题出在子图的极坐标布局是独立命名的,默认第一个是polar,第二个是polar2,直接改polar只会生效在第一个子图上,其他的没覆盖到。

下面给你调整后的完整代码,保证两个子图的布局完全统一:

首先我们先把示例数据补全(方便你直接运行),然后一步步实现:

import pandas as pd
import numpy as np
import plotly.graph_objects as go
import plotly.express as px
from plotly.offline import plot
from plotly.subplots import make_subplots

# 构造包含Month 0和Month 5的示例数据
data = [
    [0, 120, 15], [0, 160, 90], [0, 100, 90], [0, 50, 270], [0, 75, 270], [0, 40, 300],
    [5, 130, 0], [5, 170, 45], [5, 90, 180], [5, 60, 225], [5, 80, 315], [5, 50, 90]
]
fd = pd.DataFrame(data, columns=['Age_months', 'Feed_Volume_ml', 'Feed_Hour_Degrees'])

# 定义角度轴的刻度文本(对应每15度的时间标签)
ticktexts = ['12', '12:15', '12:30', '1', '1:15', '1:30',
             '2', '2:15', '2:30', '3', '3:15', '3:30',
             '4', '4:15', '4:30', '5', '5:15', '5:30',
             '6', '6:15', '6:30', '7', '7:15', '7:30']

# 生成两个独立的极坐标条形图
figures = [
    px.bar_polar(fd.loc[fd['Age_months'] == 0].sort_values(by=['Feed_Volume_ml']),
                 r="Feed_Volume_ml",
                 theta="Feed_Hour_Degrees",
                 color="Feed_Volume_ml",
                 title="Clock Map of Feeding - Month 0",
                 direction="clockwise",
                 start_angle=90,
                 range_r=(0,220)),
    px.bar_polar(fd.loc[fd['Age_months'] == 5].sort_values(by=['Feed_Volume_ml']),
                 r="Feed_Volume_ml",
                 theta="Feed_Hour_Degrees",
                 color="Feed_Volume_ml",
                 title="Clock Map of Feeding - Month 5",
                 direction="clockwise",
                 start_angle=90,
                 range_r=(0,220))
]

# 创建子图框架
fig = make_subplots(cols=len(figures), rows=1,
                    specs=[[{"type": "barpolar"}, {"type": "barpolar"}]],
                    subplot_titles=[fig.title.text for fig in figures])

# 将每个子图的trace添加到对应位置
for i, figure in enumerate(figures):
    for trace in figure["data"]:
        fig.add_trace(trace, row=1, col=i+1)

# 定义统一的极坐标布局配置(所有子图共用这套参数)
统一_polar配置 = dict(
    radialaxis=dict(
        showticklabels=False,
        range=(0, 220)  # 强制径向轴范围一致
    ),
    angularaxis=dict(
        tickvals=np.arange(0, 360, 15),
        ticktext=ticktexts,
        direction="clockwise",
        startangle=90,  # 让0度对应顶部(12点位置)
        rotation=0
    )
)

# 关键步骤:遍历每个子图的极坐标配置,逐个应用统一设置
for i in range(len(figures)):
    fig.update_layout({f'polar{i+1}': 统一_polar配置})

# 调整整体布局,优化间距和图例
fig.update_layout(
    showlegend=False,  # 不需要重复图例可以关闭,需要的话可以统一放底部
    margin=dict(l=20, r=20, t=60, b=20),
    height=400  # 可以自定义图的高度
)

plot(fig)

为什么原来的方法没生效?

Plotly的子图中,每个极坐标区域的布局参数是独立命名的:第一个子图是polar,第二个是polar2,第三个是polar3以此类推。你之前用fig.update_layout(polar=...)只会修改第一个子图的设置,其他子图的polar2完全没被改动,所以才会出现布局不一致的情况。

现在通过循环给每个polarN都应用相同的配置,就能保证所有子图的角度轴方向、刻度、径向轴范围完全统一了,你可以根据需求修改统一_polar配置里的参数,比如调整ticktext的格式、径向轴是否显示刻度等。

备注:内容来源于stack exchange,提问作者akinoali88

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.20 13:04:50