将 Vispy SceneCanvas 嵌入 PyQt5 时,绘图出现在错误的位置
The plot appears at wrong position when embedding Vispy SceneCanvas into PyQt5
我正在尝试编写 vispy.scene.SceneCanvas 的子类并将其用作我的 PyQt5 应用程序中的绘图小部件。然而,情节总是出现在错误的位置(右上角),我没有从 vispy 文档中得到任何关于这个问题的提示。
实际位置
预期排名
代码:
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):
super().__init__(**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')
self.y_axis.stretch = (1, 0.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)
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.QtCore, 'PYQT_VERSION'):
QApplication.instance().exec_()
我将您的代码与绘图 API 中的代码进行了比较,并且能够使用 height_max
和 width_max
而不是 stretch
使其正常工作。参见 https://github.com/vispy/vispy/blob/efa49b6896321374149998e15f8bce2ae327ba70/vispy/plot/plotwidget.py#L116-L131
下面是我现在的代码:
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):
super().__init__(**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.grid.add_widget(self.x_axis, row=1, col=1)
self.x_axis.height_max = 40
self.x_axis.link_view(self.vb)
self.y_axis = scene.AxisWidget(orientation='left')
self.y_axis.width_max = 40
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)
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.QtCore, 'PYQT_VERSION'):
QApplication.instance().exec_()
输出最终看起来像:
在我意识到我犯了一个菜鸟错误后问题解决了,y轴拉伸应该设置为(0.1, 1)而不是(1, 0.1),虽然有趣的是如果我正确显示它不要将 canvas 用作 PyQt 小部件。 @djhoese 的解决方案也很有效。
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):
super().__init__(**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')
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)
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.QtCore, 'PYQT_VERSION'):
QApplication.instance().exec_()
我正在尝试编写 vispy.scene.SceneCanvas 的子类并将其用作我的 PyQt5 应用程序中的绘图小部件。然而,情节总是出现在错误的位置(右上角),我没有从 vispy 文档中得到任何关于这个问题的提示。
实际位置
预期排名
代码:
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):
super().__init__(**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')
self.y_axis.stretch = (1, 0.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)
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.QtCore, 'PYQT_VERSION'):
QApplication.instance().exec_()
我将您的代码与绘图 API 中的代码进行了比较,并且能够使用 height_max
和 width_max
而不是 stretch
使其正常工作。参见 https://github.com/vispy/vispy/blob/efa49b6896321374149998e15f8bce2ae327ba70/vispy/plot/plotwidget.py#L116-L131
下面是我现在的代码:
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):
super().__init__(**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.grid.add_widget(self.x_axis, row=1, col=1)
self.x_axis.height_max = 40
self.x_axis.link_view(self.vb)
self.y_axis = scene.AxisWidget(orientation='left')
self.y_axis.width_max = 40
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)
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.QtCore, 'PYQT_VERSION'):
QApplication.instance().exec_()
输出最终看起来像:
在我意识到我犯了一个菜鸟错误后问题解决了,y轴拉伸应该设置为(0.1, 1)而不是(1, 0.1),虽然有趣的是如果我正确显示它不要将 canvas 用作 PyQt 小部件。 @djhoese 的解决方案也很有效。
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):
super().__init__(**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')
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)
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.QtCore, 'PYQT_VERSION'):
QApplication.instance().exec_()