Python Matplotlib雷达图:如何设置标签对齐?
解决Matplotlib雷达图标签环形对齐的问题
我太懂这种雷达图标签对齐的头疼事了——默认居中会直接超出轴线,手动分左右对齐又没法做到那种贴合环形的自然效果。你之前遍历标签设置对齐的思路是对的,但没考虑到雷达图是环形分布的,每个标签的最优对齐方式得跟着它所在的角度走,而不是简单一刀切左/右对齐。
这里给你一个精准适配环形角度的解决方案,能让每个标签都完美贴合轴线外侧:
核心思路
雷达图的标签角度是从0°(正右)逆时针分布的,我们可以通过计算每个角度的余弦、正弦值,判断标签在环形的哪个象限,然后设置对应的水平(ha)和垂直(va)对齐方式,甚至可以微调标签位置让它刚好卡在轴线外侧。
完整代码示例
import matplotlib.pyplot as plt import numpy as np # 1. 准备示例数据 categories = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H'] values = [4, 3, 5, 2, 4, 3, 5, 4] n = len(categories) # 生成环形角度(从0到2π,不包含终点) angles = np.linspace(0, 2 * np.pi, n, endpoint=False) # 2. 绘制雷达图(闭合图形) values = np.concatenate((values, [values[0]])) angles_closed = np.concatenate((angles, [angles[0]])) fig, ax = plt.subplots(figsize=(6, 6), subplot_kw={'polar': True}) ax.plot(angles_closed, values, 'o-', linewidth=2) ax.fill(angles_closed, values, alpha=0.25) # 3. 设置标签并调整环形对齐 ax.set_xticks(angles) ax.set_xticklabels(categories) # 遍历每个标签和对应的角度,设置对齐方式 for label, angle in zip(ax.get_xticklabels(), angles): cos_angle = np.cos(angle) sin_angle = np.sin(angle) # 水平对齐:右侧角度(cos>0)左对齐,左侧角度(cos<0)右对齐,上下角度居中 if cos_angle > 0: label.set_horizontalalignment('left') elif cos_angle < 0: label.set_horizontalalignment('right') else: label.set_horizontalalignment('center') # 垂直对齐:上侧角度(sin>0)底部对齐,下侧角度(sin<0)顶部对齐,左右角度居中 if sin_angle > 0: label.set_verticalalignment('bottom') elif sin_angle < 0: label.set_verticalalignment('top') else: label.set_verticalalignment('center') # 可选:微调标签位置,让它离轴线更远一点(1.1是缩放因子,可按需调整) label.set_position((1.1 * cos_angle, 1.1 * sin_angle)) plt.show()
为什么这个方法有效?
- 不像简单的左右分半对齐,这个方案会自动适配每个角度的位置:比如正上方的标签会居中+底部对齐,正下方的标签会居中+顶部对齐,45°的标签会左对齐+底部对齐,完全贴合环形的走向。
- 最后的
set_position可以让标签刚好落在轴线外侧,既不会超出图边界,也不会和轴线挤在一起。
内容的提问来源于stack exchange,提问作者Paulbd
相关产品推荐
相关产品推荐

