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

如何在极坐标图中使用set_theta_offset和set_theta_direction对齐旋转刻度标签

极坐标图刻度标签对齐与方向控制解决方案

问题说明

需要实现极坐标图的theta刻度标签沿圆形对齐,同时控制刻度起始位置与顺时针排列顺序。编写代码后,未添加set_theta_offset和set_theta_direction时标签显示正常,但添加ax1.set_theta_offset(np.pi / 2)和ax1.set_theta_direction(-1)后标签出现错位。手动修改标签列表顺序虽能临时解决,但会破坏依赖theta方向与偏移的绘图数据。

原代码如下:

import matplotlib.pyplot as plt
import numpy as np

fig = plt.figure(figsize=(6, 6))
ax1 = fig.add_subplot(projection="polar")

labels = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]
angles = [0, 30, 60, 90, 120, 150, 180, 210, 240, 270, 300, 330]
theta_ticks = np.linspace(0.,330.,12)

plt.thetagrids(angles=angles, labels=labels)

for label, angle in zip(ax1.get_xticklabels(), theta_ticks):
    x, y = label.get_position()
    lab = ax1.text(x, y, label.get_text(), transform=label.get_transform(), ha=label.get_ha(), va=label.get_va())
    lab.set_rotation(angle-90)

ax1.set_xticklabels([])

plt.show()

添加以下代码后标签错位:

ax1.set_theta_offset(np.pi / 2)
ax1.set_theta_direction(-1)

解决方案

核心问题是设置theta偏移和方向后,原有的角度计算未同步更新。需基于当前轴的theta变换获取实际显示角度,以此计算标签旋转角度,避免错位。

修改后完整代码

import matplotlib.pyplot as plt
import numpy as np

fig = plt.figure(figsize=(6, 6))
ax1 = fig.add_subplot(projection="polar")

# 先设置theta的偏移与方向,确保后续刻度基于正确坐标系生成
ax1.set_theta_offset(np.pi / 2)
ax1.set_theta_direction(-1)

labels = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]
angles_deg = np.arange(0, 360, 30)  # 原始角度(度)
theta_ticks = np.deg2rad(angles_deg)  # 转换为弧度

# 设置刻度网格
plt.thetagrids(angles=angles_deg, labels=labels)

# 遍历刻度标签,计算正确旋转角度
for label, theta in zip(ax1.get_xticklabels(), theta_ticks):
    # 获取经过变换后的实际显示角度(已考虑偏移和方向)
    displayed_theta = ax1.get_theta_transform().transform_angles(np.array([theta]), np.array([0]), np.array([0]))[0]
    # 设置标签旋转角度,使其沿圆形对齐
    label.set_rotation(displayed_theta - 90)

plt.show()

关键要点

  • 先设置坐标系变换:提前调用set_theta_offset和set_theta_direction,让后续刻度生成基于正确的极坐标系统。
  • 获取实际显示角度:使用ax1.get_theta_transform().transform_angles()计算每个原始theta对应的实际显示角度,该角度已自动适配偏移和方向设置。
  • 动态计算旋转角度:用实际显示角度减去90°,确保标签沿圆形切线方向对齐,避免错位。

内容的提问来源于stack exchange,提问作者Henning Meier

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 20:55:20