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

PyQtGraph中如何独立于坐标轴值实现曲线旋转?

在PyQtGraph中实现曲线独立于坐标轴数值的旋转方案

核心思路是将曲线数据转换到视觉像素坐标系完成旋转,再转回原始数据坐标系,彻底避开坐标轴数值量级差异的影响。具体实现步骤如下:

实现步骤

  • 把曲线的原始数据点从数据坐标转换为ViewBox内的像素坐标
  • 以指定点(如曲线中心点、选中点)为旋转中心,将所有像素点平移到以该中心为原点的坐标系
  • 应用旋转矩阵完成旋转计算
  • 将旋转后的像素点转换回数据坐标,更新曲线数据

代码示例

import pyqtgraph as pg
from PyQt5.QtCore import QPointF
import numpy as np

def rotate_curve(curve, view_box, angle_deg, center_data):
    # 角度转弧度
    angle_rad = np.deg2rad(angle_deg)
    cos_theta = np.cos(angle_rad)
    sin_theta = np.sin(angle_rad)
    
    # 获取曲线原始数据(建议提前将原始数据存在curve属性中,避免多次旋转累积误差)
    if hasattr(curve, "original_data"):
        x_data, y_data = curve.original_data
    else:
        x_data, y_data = curve.getData()
        curve.original_data = (x_data, y_data)
    
    # 数据坐标转像素坐标
    pixel_points = [view_box.mapFromView(QPointF(x, y)) for x, y in zip(x_data, y_data)]
    # 旋转中心转像素坐标
    center_pixel = view_box.mapFromView(QPointF(*center_data))
    
    # 执行旋转计算
    rotated_pixels = []
    for p in pixel_points:
        # 平移到旋转中心为原点
        dx = p.x() - center_pixel.x()
        dy = p.y() - center_pixel.y()
        # 旋转矩阵运算
        new_dx = dx * cos_theta - dy * sin_theta
        new_dy = dx * sin_theta + dy * cos_theta
        # 平移回原位置
        rotated_p = QPointF(new_dx + center_pixel.x(), new_dy + center_pixel.y())
        rotated_pixels.append(rotated_p)
    
    # 像素坐标转回数据坐标
    rotated_x, rotated_y = [], []
    for p in rotated_pixels:
        data_point = view_box.mapToView(p)
        rotated_x.append(data_point.x())
        rotated_y.append(data_point.y())
    
    # 更新曲线数据
    curve.setData(rotated_x, rotated_y)

使用说明

  1. 提前将曲线的原始数据存储在曲线对象的original_data属性中,避免多次旋转导致的误差累积
  2. 在滑块的valueChanged信号回调中调用该函数:
    # 示例:以曲线中心点为旋转中心,旋转30度
    plot = pg.plot()
    curve = plot.plot(x, y)
    view_box = plot.getViewBox()
    center = (np.mean(x), np.mean(y))
    rotate_curve(curve, view_box, 30, center)
    

注意事项

  • 旋转中心建议选择曲线自身的点(如中心点、选中的特征点),避免旋转后曲线偏移出可视区域
  • 该方法完全基于视觉像素空间操作,与坐标轴的数值范围、量级无关,完美解决x轴极小、y轴极大的场景问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 06:29:58