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

Vispy SceneCanvas嵌入PyQt5时绘图位置异常问题求助

问题原因

偏移问题由两处配置错误共同导致:

  1. Y轴的stretch参数赋值颠倒:左轴是垂直方向延伸、水平方向窄,你设置的(1, 0.1)会让Y轴水平方向占满、垂直方向被压缩,挤占了绘图区域的空间
  2. 视图相机没有自动适配数据范围,默认初始视角偏移,导致绘图内容出现在角落

修复后代码

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 22:15:02