基于Python的角度分布可视化及玫瑰图实现方法咨询
角度分布可视化方案结论
针对你手里371行航迹控制角度(Track_Angle_Ctrl列,单位为度)的分布可视化需求:
- 玫瑰图(极坐标柱状图)是非常适配的方案,完全可以用,属于这类圆周周期型数据的首选可视化方式之一,不存在适配性问题。
- 如果需要补充平滑的分布趋势,可以在玫瑰图基础上叠加极坐标核密度曲线,不需要额外换其他图表类型。
玫瑰图适配这个场景的核心原因
- 角度是0-360度循环的周期值,普通直角坐标直方图会把0度和360度割裂在坐标轴两端,很容易把跨0点的连续分布误读为两个独立的峰;玫瑰图的环形极坐标结构天然匹配角度的周期属性,不存在这个问题。
- 371的样本量足够支撑分箱统计,不会因为样本过少出现柱高随机波动过大、分布规律被噪声掩盖的问题。
- 玫瑰图的可读性极强,不需要额外解释就能快速看出角度分布的集中区间、多峰特征、方向偏好,适合做结论展示。
具体实现步骤(Python通用方案,依赖pandas、numpy、matplotlib,都是数据分析常规库)
首先提前做数据校验:如果你的角度列存在负值、或者大于360度的值,先做取模归一化到0-360度区间,执行命令:df['Track_Angle_Ctrl'] = df['Track_Angle_Ctrl'] % 360
- 第一步:导入依赖、读取本地CSV文件
import pandas as pd import numpy as np import matplotlib.pyplot as plt # 把引号内的内容替换成你本地CSV的实际路径 df = pd.read_csv('your_track_data.csv') angles = df['Track_Angle_Ctrl'].values
- 第二步:角度分箱统计
371个样本推荐按每20-30度做一个分箱:30度分箱对应12个方位区间,可读性最好;20度分箱共18个区间,能展示更细的分布特征。
# 分箱宽度设置,可按需调整为20 bin_width = 30 # 生成分箱边界 bins = np.arange(0, 360 + bin_width, bin_width) # 统计每个分箱内的样本数量 counts, bin_edges = np.histogram(angles, bins=bins) # 计算每个分箱的中心角度,转换为弧度供matplotlib极坐标使用 bin_centers = np.deg2rad(bin_edges[:-1] + bin_width / 2)
- 第三步:绘制玫瑰图主体
# 创建正方形画布,避免极坐标拉伸变形 fig = plt.figure(figsize=(8, 8), dpi=100) ax = fig.add_subplot(111, polar=True) # 绘制极坐标柱状图(玫瑰图核心) bars = ax.bar( x=bin_centers, height=counts, width=np.deg2rad(bin_width), bottom=0, color='#2E86AB', alpha=0.75 ) # 调整极坐标样式匹配航迹角度的常规认知 ax.set_theta_zero_location('N') # 将0度设置在正北方 ax.set_theta_direction(-1) # 设置角度顺时针增长 ax.set_xticks(np.deg2rad(np.arange(0, 360, 30))) ax.set_xticklabels(['0°', '30°', '60°', '90°', '120°', '150°', '180°', '210°', '240°', '270°', '300°', '330°']) ax.set_ylabel('区间样本数', labelpad=30) plt.title('Track_Angle_Ctrl 角度分布玫瑰图', pad=20, fontsize=12) plt.show()
- 第四步:可选优化
- 如果要展示占比而非绝对样本数,把统计值替换为
counts / counts.sum(),同时把纵轴标签改为“区间占比”即可 - 可以给每个柱子添加数值标注,直接在柱顶显示对应区间的样本数/占比
- 需要看平滑分布趋势的话,可以用
scipy.stats.gaussian_kde生成极坐标下的密度曲线,叠加在玫瑰图上层
- 如果要展示占比而非绝对样本数,把统计值替换为
不使用玫瑰图的备选方案
如果因为排版、风格问题不想用玫瑰图,可以选以下方案,优先级从高到低:
- 环形直方图:逻辑和玫瑰图一致,只是把柱子做中空处理,视觉上更轻量化
- 调整截断点的直角坐标直方图:手动把坐标轴的截断位置选在样本分布最少的角度区间,避免割裂连续分布,但是需要额外做分布探查,不如玫瑰图方便
- 极坐标密度热图:更适合万级以上样本量的场景,371个样本使用会显得分布过于稀疏,不推荐
内容的提问来源于stack exchange,提问作者Prateek Sinha
相关产品推荐
相关产品推荐

