Vispy SceneCanvas嵌入PyQt5时绘图位置异常问题求助
问题原因
偏移问题由两处配置错误共同导致:
- Y轴的
stretch参数赋值颠倒:左轴是垂直方向延伸、水平方向窄,你设置的(1, 0.1)会让Y轴水平方向占满、垂直方向被压缩,挤占了绘图区域的空间 - 视图相机没有自动适配数据范围,默认初始视角偏移,导致绘图内容出现在角落
修复后代码
import vispy.scene as scene import numpy as np from PyQt5.QtWidgets import * from PyQt5.QtCore import * from PyQt5.QtGui import * import sys class CustomPlot(scene.SceneCanvas): def __init__(self, **kwargs): # 新增keys参数开启基础交互,也可以根据需要设置为None super().__init__(keys='interactive', **kwargs) self.unfreeze() self.grid = self.central_widget.add_grid(spacing=0) self.vb = self.grid.add_view(row=0, col=1, camera='panzoom') self.x_axis = scene.AxisWidget(orientation='bottom') self.x_axis.stretch = (1, 0.1) self.grid.add_widget(self.x_axis, row=1, col=1) self.x_axis.link_view(self.vb) self.y_axis = scene.AxisWidget(orientation='left') # 修复:左轴stretch参数调换为(0.1, 1),水平占比0.1,垂直占比1 self.y_axis.stretch = (0.1, 1) self.grid.add_widget(self.y_axis, row=0, col=0) self.y_axis.link_view(self.vb) pos = np.array([[0, 0], [1, 1], [2, 0]]) line = scene.Line(pos, 'red', parent=self.vb.scene) # 新增:自动适配相机范围到数据边界 self.vb.camera.set_range() if __name__ == "__main__": QApplication.setAttribute(Qt.AA_EnableHighDpiScaling) app = QApplication([]) win = QMainWindow() win.setCentralWidget(CustomPlot().native) win.show() if (sys.flags.interactive != 1) or not hasattr(Qt, 'PYQT_VERSION'): QApplication.instance().exec_()
核心修改点
- 修正Y轴的
stretch参数为(0.1, 1),匹配左轴的尺寸比例需求 - 绘制完图形后调用
self.vb.camera.set_range(),让相机自动适配数据范围,初始视角居中显示所有内容 - 初始化
SceneCanvas时传入keys='interactive',避免后续交互操作出现快捷键冲突问题 - 修复了原代码中
hasattr(Qt.QtCore, 'PYQT_VERSION')的错误引用,直接访问Qt下的属性即可
内容的提问来源于stack exchange,提问作者Zongyue Lu
相关产品推荐
相关产品推荐

