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

如何在Python Plotly子图中统一修改所有风玫瑰图属性?

解决Plotly子图风玫瑰图仅单个图属性更新的问题

问题背景

使用plotly.graph_objects.Bar绘制多子图风玫瑰图后,调用fig.update_layout()修改极轴属性时,只有第一个子图的属性生效,其余子图无变化。需要批量修改所有子图的polar_angularaxis_rotation、polar_angularaxis_direction、polar_angularaxis_tickvals、polar_angularaxis_ticktext等属性。

核心原因

fig.update_layout()中的polar相关配置默认仅作用于第一个极坐标系(polar),而子图中的每个风玫瑰图对应独立的polar轴(如polar2、polar3等),因此无法批量生效。

可行解决方案

方案1:使用fig.update_polars()批量更新所有极轴属性

这是最简便的方法,update_polars()会自动对所有子图的极轴应用配置:

# 先设置全局标题等非极轴属性
fig.update_layout(
    title=title,
    title_font_size=26,
    title_x=0.463,
    legend_font_size=18
)

# 批量更新所有子图的极轴属性
fig.update_polars(
    radialaxis_ticksuffix='%',
    angularaxis_rotation=90,
    angularaxis_direction='clockwise',
    angularaxis_tickmode='array',
    angularaxis_tickvals=[0, 45, 90, 135, 180, 225, 270, 315],
    angularaxis_ticktext=['<b>N</b>','NE', '<b>E</b>', 'SE', '<b>S</b>', 'SW', '<b>W</b>', 'NW'],
    angularaxis_tickfont_size=22,
    radialaxis_tickmode='linear',
    radialaxis_angle=45,
    radialaxis_tick0=5,
    radialaxis_dtick=5,
    radialaxis_tickangle=100,
    radialaxis_tickfont_size=14
)

方案2:遍历每个子图的极轴逐个配置

如果需要对不同子图设置差异化属性,可通过遍历fig.layout中的所有polar轴进行修改:

# 全局标题配置
fig.update_layout(
    title=title,
    title_font_size=26,
    title_x=0.463,
    legend_font_size=18
)

# 定义极轴通用配置
polar_config = {
    'radialaxis_ticksuffix': '%',
    'angularaxis_rotation': 90,
    'angularaxis_direction': 'clockwise',
    'angularaxis_tickmode': 'array',
    'angularaxis_tickvals': [0, 45, 90, 135, 180, 225, 270, 315],
    'angularaxis_ticktext': ['<b>N</b>','NE', '<b>E</b>', 'SE', '<b>S</b>', 'SW', '<b>W</b>', 'NW'],
    'angularaxis_tickfont_size': 22,
    'radialaxis_tickmode': 'linear',
    'radialaxis_angle': 45,
    'radialaxis_tick0': 5,
    'radialaxis_dtick': 5,
    'radialaxis_tickangle': 100,
    'radialaxis_tickfont_size': 14
}

# 遍历所有polar轴并应用配置
for polar_name in [attr for attr in fig.layout if attr.startswith('polar')]:
    fig.layout[polar_name].update(polar_config)

方案3:创建子图时直接指定极轴属性

在使用make_subplots()创建子图时,通过specs参数预先定义每个子图的极轴属性:

from plotly.subplots import make_subplots

# 定义每个子图的极轴配置
polar_spec = {
    'type': 'polar',
    'angularaxis': {
        'rotation': 90,
        'direction': 'clockwise',
        'tickmode': 'array',
        'tickvals': [0, 45, 90, 135, 180, 225, 270, 315],
        'ticktext': ['<b>N</b>','NE', '<b>E</b>', 'SE', '<b>S</b>', 'SW', '<b>W</b>', 'NW'],
        'tickfont': {'size': 22}
    },
    'radialaxis': {
        'ticksuffix': '%',
        'tickmode': 'linear',
        'angle': 45,
        'tick0': 5,
        'dtick': 5,
        'tickangle': 100,
        'tickfont': {'size': 14}
    }
}

# 创建2行2列的子图,每个子图应用polar_spec
fig = make_subplots(
    rows=2, cols=2,
    specs=[[polar_spec, polar_spec], [polar_spec, polar_spec]]
)

# 后续添加Bar trace...

内容的提问来源于stack exchange,提问作者Mohamed Ait Ahmed

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 23:00:42