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

如何在Matplotlib极坐标轴中实现鼠标左键拖动平移功能

极坐标轴平移与浮动极轴绘图解决方案

一、修复极坐标轴的平移功能

Matplotlib默认极坐标轴未开启平移交互,以下两种方案可实现平移需求:

方案1:自定义极坐标平移交互

通过绑定鼠标事件自定义平移逻辑,直接修改极轴的角度和径向范围:

import matplotlib.pyplot as plt
import numpy as np

r = np.arange(0, 2, 0.01)
theta = 2 * np.pi * r

fig, ax = plt.subplots(subplot_kw={'projection': 'polar'})
ax.plot(theta, r)
ax.set_rmax(2)
ax.set_rticks([0.5, 1, 1.5, 2])
ax.set_rlabel_position(-22.5)
ax.grid(True)
ax.set_title("Polar plot with custom pan support", va='bottom')

# 自定义平移函数
def polar_pan(event):
    if ax.get_navigate_mode() != 'PAN' or not event.button == 1:
        return
    if event.xpress is None or event.ypress is None:
        return
    # 计算鼠标移动距离,调整灵敏度
    dx = event.x - event.xpress
    dy = event.y - event.ypress
    theta_step = dx / 50  # 角度平移步长
    r_step = -dy / 50     # 径向平移步长(反向适配鼠标拖动方向)
    
    # 更新角度和径向范围
    curr_theta = ax.get_thetalim()
    curr_r = ax.get_ylim()
    ax.set_thetalim(curr_theta[0] + theta_step, curr_theta[1] + theta_step)
    ax.set_ylim(curr_r[0] + r_step, curr_r[1] + r_step)
    fig.canvas.draw_idle()

# 绑定鼠标事件
fig.canvas.mpl_connect('motion_notify_event', polar_pan)
fig.canvas.mpl_connect('button_press_event', lambda e: setattr(e, 'xpress', e.x) or setattr(e, 'ypress', e.y))

plt.show()

方案2:笛卡尔轴模拟极坐标

将极坐标数据转换为笛卡尔坐标,利用普通轴的原生平移缩放功能,再手动添加极坐标样式的网格和标签:

import matplotlib.pyplot as plt
import numpy as np

r = np.arange(0, 2, 0.01)
theta = 2 * np.pi * r

# 极坐标转笛卡尔坐标
x = r * np.cos(theta)
y = r * np.sin(theta)

fig, ax = plt.subplots()
ax.plot(x, y)
ax.set_aspect('equal')  # 保持比例,模拟极坐标
ax.grid(True)

# 添加径向刻度标签
for r_val in [0.5, 1, 1.5, 2]:
    ax.text(r_val, 0, str(r_val), ha='center', va='top')
# 添加角度刻度标签
for deg in [0, 90, 180, 270]:
    rad = np.deg2rad(deg)
    ax.text(2.2*np.cos(rad), 2.2*np.sin(rad), f"{deg}°", ha='center', va='center')

ax.set_title("Cartesian-based polar plot with native pan/zoom", va='bottom')
plt.show()

二、在浮动极坐标轴中绘制曲线

基于官方浮动轴示例,只需获取浮动极轴的绘图实例,即可直接绘制极坐标曲线:

import matplotlib.pyplot as plt
from mpl_toolkits.axes_grid1 import host_subplot
from mpl_toolkits.axisartist import floating_axes
import numpy as np

# 创建宿主笛卡尔轴
host = host_subplot(111, axes_class=floating_axes.GridHost)
plt.subplots_adjust(right=0.75)

# 定义极坐标范围(角度:-90°到90°,径向:0到2)
theta_lim = (-np.pi/2, np.pi/2)
r_lim = (0, 2)
transform = floating_axes.GridTransform(theta_lim, r_lim, polar=True)

# 创建浮动极坐标轴
grid_helper = floating_axes.GridHelperCurveLinear(transform, extremes=(theta_lim[0], theta_lim[1], r_lim[0], r_lim[1]))
ax_polar = floating_axes.FloatingSubplot(host, 111, grid_helper=grid_helper)
host.add_subplot(ax_polar)

# 隐藏宿主轴的冗余刻度
host.axis["left"].set_visible(False)
host.axis["bottom"].set_visible(False)

# 获取可绘图的极轴实例
ax = ax_polar.get_aux_axes(transform)

# 绘制极坐标曲线
r = np.arange(0, 2, 0.01)
theta = 2 * np.pi * r
ax.plot(theta, r)

# 设置极轴属性
ax.set_rmax(2)
ax.set_rticks([0.5, 1, 1.5, 2])
ax.set_rlabel_position(-22.5)
ax.grid(True)
ax.set_title("Floating polar axis with curve", va='bottom')

# 拖动外层笛卡尔轴即可平移内部极坐标图
plt.show()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 09:38:15