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

Vispy坐标轴初始位置异常,平移/缩放后恢复正常的问题求助

Vispy坐标轴初始位置异常,平移/缩放后恢复正常的问题求助

大家好,我遇到了一个Vispy嵌入Qt后的坐标轴显示问题,想请教一下各位:

我尝试给图像添加X、Y坐标轴,但初始加载时坐标轴的信息显示是错误的;不过只要对图像执行一次平移或者缩放操作,坐标轴就会立刻显示正常。

我基于Vispy官方的「Embed Vispy into QT」示例修改了代码,完整复现了这个问题,修改后的代码如下:

"""
Embed VisPy into Qt
===================

Display VisPy visualizations in a PyQt5 application.
"""

import numpy as np

from PyQt5 import QtWidgets

from vispy.scene import SceneCanvas, visuals, AxisWidget
from vispy.app import use_app

IMAGE_SHAPE = (600, 800)  # (height, width)
CANVAS_SIZE = (800, 600)  # (width, height)
NUM_LINE_POINTS = 200


class MyMainWindow(QtWidgets.QMainWindow):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        central_widget = QtWidgets.QWidget()
        main_layout = QtWidgets.QHBoxLayout()
        self._controls = Controls()
        main_layout.addWidget(self._controls)
        self._canvas_wrapper = CanvasWrapper()
        main_layout.addWidget(self._canvas_wrapper.canvas.native)
        central_widget.setLayout(main_layout)
        self.setCentralWidget(central_widget)


class Controls(QtWidgets.QWidget):
    def __init__(self, parent=None):
        super().__init__(parent)
        layout = QtWidgets.QVBoxLayout()
        self.colormap_label = QtWidgets.QLabel("Image Colormap:")
        layout.addWidget(self.colormap_label)
        self.colormap_chooser = QtWidgets.QComboBox()
        self.colormap_chooser.addItems(["viridis", "reds", "blues"])
        layout.addWidget(self.colormap_chooser)
        self.line_color_label = QtWidgets.QLabel("Line color:")
        layout.addWidget(self.line_color_label)
        self.line_color_chooser = QtWidgets.QComboBox()
        self.line_color_chooser.addItems(["black", "red", "blue"])
        layout.addWidget(self.line_color_chooser)
        layout.addStretch(1)
        self.setLayout(layout)


class CanvasWrapper:
    def __init__(self):
        self.canvas = SceneCanvas(size=CANVAS_SIZE)
        self.grid = self.canvas.central_widget.add_grid()
        self.view_top = self.grid.add_view(0, 1, bgcolor='cyan')

        image_data = _generate_random_image_data(IMAGE_SHAPE)
        self.image = visuals.Image(
            image_data,
            texture_format="auto",
            cmap="viridis",
            parent=self.view_top.scene,
        )

        self.view_top.camera = "panzoom"
        self.view_top.camera.set_range(
            x=(0, IMAGE_SHAPE[1]), y=(0, IMAGE_SHAPE[0]), margin=0)

        self.x_axis = AxisWidget(
            axis_label="X Axis Label", orientation='bottom')
        self.x_axis.stretch = (1, 0.1)
        self.grid.add_widget(self.x_axis, row=1, col=1)
        self.grid.padding = 0
        self.x_axis.link_view(self.view_top)

        self.y_axis = AxisWidget(
            axis_label="Y Axis Label", orientation='left')
        self.y_axis.stretch = (0.1, 1)
        self.grid.add_widget(self.y_axis, row=0, col=0)
        self.y_axis.link_view(self.view_top)


def _generate_random_image_data(shape, dtype=np.float32):
    rng = np.random.default_rng()
    data = rng.random(shape, dtype=dtype)
    return data


def _generate_random_line_positions(num_points, dtype=np.float32):
    rng = np.random.default_rng()
    pos = np.empty((num_points, 2), dtype=np.float32)
    pos[:, 0] = np.arange(num_points)
    pos[:, 1] = rng.random((num_points,), dtype=dtype)
    return pos


if __name__ == "__main__":
    app = use_app("pyqt5")
    app.create()
    win = MyMainWindow()
    win.show()
    app.run()

初始生成的图像中坐标轴显示异常,而一旦对画布进行平移或缩放操作,坐标轴就会自动修正为正确状态。

有没有朋友知道该怎么调整,让坐标轴在初始加载时就正常显示呢?


备注:内容来源于stack exchange,提问作者ViNOJ

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.22 14:29:33