如何用Plotly实现带彩色分段的极坐标扇形图?
解决方案
1. 拆分条形为彩色分段
要实现每个极坐标条形的彩色分段,你可以基于数值区间或原有数据的维度(比如strength风速强度)构造分层数据,通过多个bar_polar轨迹叠加,让每个分段对应独立的颜色与数值范围。
以你提供的wind数据集为例,保留所有strength类别,让每个方向的条形按不同风速强度拆分:
import pandas as pd import plotly.express as px import plotly.graph_objects as go df = px.data.wind() # 按方向和风速强度排序,保证分段顺序一致 df_sorted = df.sort_values(['direction', 'strength']) fig = go.Figure() # 为每个风速强度添加独立的极坐标条形轨迹 for strength in df['strength'].unique(): df_sub = df_sorted[df_sorted['strength'] == strength] fig.add_trace(go.Barpolar( r=df_sub['frequency'], theta=df_sub['direction'], name=strength, marker_color=px.colors.sequential.YlGn[len(df['strength'].unique()) - df['strength'].unique().tolist().index(strength) - 1], opacity=0.8 )) # 调整布局优化显示 fig.update_layout( polar=dict( radialaxis=dict(visible=True, range=[0, df['frequency'].sum()/8]), angularaxis=dict(visible=True, direction='clockwise') ), legend_title_text='风速强度' ) fig.show()
运行后每个方向的条形会拆分为不同强度对应的彩色分段,和你目标图的效果一致。
2. 用极坐标扇形替代条形
只需调整bar_polar的width参数,让条形宽度等于相邻方向的角度间隔即可。比如wind数据集有8个方向,每个方向间隔45度,设置width=45就能将条形转为扇形:
import pandas as pd import plotly.express as px df = px.data.wind() df_test = df[df["strength"]=='0-1'] fig = px.bar_polar(df_test, r='frequency', theta='direction', color='frequency', color_continuous_scale='YlGn', width=45) # 设置宽度为角度间隔 fig.update_layout(polar=dict(angularaxis=dict(direction='clockwise'))) fig.show()
3. 添加横轴(径向轴优化)
极坐标的**径向轴(radial axis)**就是对应数值的横轴,你可以通过update_layout优化它的显示效果,比如添加刻度、标题:
fig.update_layout( polar=dict( radialaxis=dict( visible=True, tickmode='linear', tick0=0, dtick=5, title='频率' # 添加轴标题 ) ) )
如果偏好笛卡尔坐标系的横轴,可改用堆叠条形图替代极坐标:
fig = px.bar(df_sorted, x='direction', y='frequency', color='strength', color_discrete_sequence=px.colors.sequential.YlGn, barmode='stack') fig.show()
4. 适配的其他Plotly图表类型
- 堆叠极坐标条形图:即上述第一种方案,最匹配你的需求;
- 旭日图(Sunburst):适合展示方向、强度、频率的层级关系,但视觉风格与目标图差异较大;
- 径向热力图:通过极坐标转换展示连续数据的密度分布,适合不同的数据分析场景。
内容的提问来源于stack exchange,提问作者User981636
相关产品推荐
相关产品推荐

