如何在Plotly Python的scatter_polar图表中排序角轴与径向轴标签?
调整Plotly Polar图表的轴标签排序方法
不管你用Plotly Graph Objects还是Plotly Express,都能轻松自定义极坐标图的角轴(小时)和径向轴(工作日)标签顺序,核心是指定分类的自定义排序数组,以下是具体实现方式:
方法一:使用Plotly Graph Objects(灵活可控)
先准备模拟数据和目标排序,再通过配置轴参数实现自定义顺序:
import plotly.graph_objects as go import pandas as pd # 模拟工作日各小时计数数据 data = pd.DataFrame({ "工作日": ["周一", "周一", "周二", "周二", "周三", "周三"], "小时": [9, 14, 10, 15, 11, 16], "计数": [20, 35, 25, 40, 30, 45] }) # 定义你需要的目标排序顺序 target_weekday_order = ["周一", "周二", "周三", "周四", "周五", "周六", "周日"] target_hour_order = list(range(24)) # 0-23的顺序,可替换为自定义小时列表 # 创建极坐标散点图 fig = go.Figure() fig.add_trace(go.Scatterpolar( r=data["工作日"], # 径向轴绑定工作日数据 theta=data["小时"], # 角轴绑定小时数据 mode='markers', marker=dict(size=data["计数"], color=data["计数"], colorscale='Viridis'), text=data["计数"] )) # 配置轴的自定义排序 fig.update_layout( polar=dict( radialaxis=dict( categoryorder='array', # 指定使用自定义数组排序 categoryarray=target_weekday_order, # 传入工作日目标顺序 title="工作日" ), angularaxis=dict( categoryorder='array', categoryarray=target_hour_order, # 传入小时目标顺序 title="小时", direction="clockwise", # 可选:让小时顺时针排列,符合日常习惯 tickmode="array", tickvals=target_hour_order, ticktext=[str(h) for h in target_hour_order] # 可选:自定义刻度显示文本 ) ), title="工作日各小时计数极坐标图" ) fig.show()
关键参数说明:
categoryorder='array':告诉Plotly不要用默认的字母/数值排序,改用你指定的数组顺序categoryarray:传入预先定义好的目标排序列表,必须和数据中的轴值完全匹配(比如数据里是"周一",数组里不能写成"星期一")direction="clockwise":角轴默认是逆时针排列,加上这个参数可以让小时从0点开始顺时针分布,更符合日常认知
方法二:使用Plotly Express(简洁高效)
如果用Plotly Express,直接通过category_orders参数就能快速指定排序,不需要单独配置轴:
import plotly.express as px import pandas as pd data = pd.DataFrame({ "工作日": ["周一", "周一", "周二", "周二", "周三", "周三"], "小时": [9, 14, 10, 15, 11, 16], "计数": [20, 35, 25, 40, 30, 45] }) target_weekday_order = ["周一", "周二", "周三", "周四", "周五", "周六", "周日"] target_hour_order = list(range(24)) fig = px.scatter_polar( data, r="工作日", theta="小时", size="计数", color="计数", category_orders={ # 直接指定各分类列的排序 "工作日": target_weekday_order, "小时": target_hour_order } ) # 可选:调整角轴为顺时针排列 fig.update_layout( polar=dict( angularaxis=dict( direction="clockwise" ) ) ) fig.show()
注意事项:
- 确保
category_orders中的键名和数据中的列名完全一致 - 如果你的小时数据是数值类型,
target_hour_order可以直接用数值列表;如果是字符串类型,数组里也要对应使用字符串(比如["0", "1", ..., "23"])
内容的提问来源于stack exchange,提问作者Ailurophile
相关产品推荐
相关产品推荐

