如何将3d GLViewWidget插入包含2d PyQtGraph绘图的窗口中

时间:2018-10-08 14:19:47

标签: python matplotlib opengl pyqtgraph

我正在尝试将一些绘图代码从matplotlib移植到pyqtgraph以提高性能。 pyqtgraph示例分别提供了2d图和3d图的示例,但是我无法找到作为2d图窗口中的子图嵌入的3d图的样本。 我尝试将GLViewWidget嵌入到GraphicsWindow中,如下所示。发生的是,我可以嵌入多个2d图或多个3d GLViewWidgets,但不能同时嵌入两者。一旦将2d小部件添加到布局中,它们便会完全占据主导地位,而我看不到3d小部件。

我还尝试添加具有自己布局的QGroupBox小部件,并向其中添加3d小部件,甚至尝试设置组框和3d小部件的最小宽度,这些似乎都没有帮助。

我正在使用Anaconda 3:

pyqt                      5.6.0            py37ha878b3d_6
pyqtgraph                 0.10.0           py37h28b3542_3
python                    3.7.0


from pyqtgraph.Qt import QtGui, QtCore
import numpy as np
import pyqtgraph as pg
import pyqtgraph.opengl as gl

app = QtGui.QApplication([])

win = pg.GraphicsWindow(title="A 2d plot window")

p1 = pg.PlotWidget()

# try adding a 3d plot

glvw = gl.GLViewWidget()
z = pg.gaussianFilter(np.random.normal(size=(50,50)), (1,1))
p13d = gl.GLSurfacePlotItem(z=z, shader='shaded', color=(0.5, 0.5, 1, 1))
glvw.addItem(p13d)

# get a layout
layoutgb = QtGui.QGridLayout()
win.setLayout(layoutgb)

layoutgb.addWidget(glvw, 0, 0)
# layoutgb.addWidget(p1, 0, 1)  ### uncommenting this line causes 
       #the plot widget to appear and the 3d widget to disappear

QtGui.QApplication.instance().exec_()

1 个答案:

答案 0 :(得分:0)

“ PlotWidget具有更积极的默认设置,因为它继承自QGraphicsView”-source我还没有了解PyQT(Graph)和OpenGL,所以很抱歉我不能多说,但是这些3行代码可以解决您的激励示例:

p1.sizeHint = lambda: pg.QtCore.QSize(100, 100)
glvw.sizeHint = lambda: pg.QtCore.QSize(100, 100)
glvw.setSizePolicy(p1.sizePolicy())

如:

from pyqtgraph.Qt import QtGui, QtCore
import numpy as np
import pyqtgraph as pg
import pyqtgraph.opengl as gl

app = QtGui.QApplication([])

win = pg.GraphicsWindow(title="A 2d plot window")

p1 = pg.PlotWidget()

# try adding a 3d plot

glvw = gl.GLViewWidget()
z = pg.gaussianFilter(np.random.normal(size=(50,50)), (1,1))
p13d = gl.GLSurfacePlotItem(z=z, shader='shaded', color=(0.5, 0.5, 1, 1))
glvw.addItem(p13d)

# get a layout
layoutgb = QtGui.QGridLayout()
win.setLayout(layoutgb)

layoutgb.addWidget(glvw, 0, 0)
layoutgb.addWidget(p1, 0, 1)  ### uncommenting this line causes 
       # the plot widget to appear and the 3d widget to disappear

p1.sizeHint = lambda: pg.QtCore.QSize(100, 100)
glvw.sizeHint = lambda: pg.QtCore.QSize(100, 100)
glvw.setSizePolicy(p1.sizePolicy())

QtGui.QApplication.instance().exec_()