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)
使用说明
- 提前将曲线的原始数据存储在曲线对象的
original_data属性中,避免多次旋转导致的误差累积 - 在滑块的
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
相关产品推荐
相关产品推荐

