如何在python qt设计器或pyqt5中添加matplotlib 3d pyplot

2024-10-01 00:36:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我的问题很简单,但我找不到答案,大家能帮我吗

问题是在python GUI pyqt5中,我想使用matplotlib绘制3d轴,我发现函数matplotlib.pyplot和mpl_toolkit.mplot3d可以很好地完成,但pyqt5只能使用函数matplotlib.figure和matplotlib.backends.backend_qt5agg

然后:

在我的概念中,matplotlib.backends.backend_qt5agg仅使用二维轴绘制,不能旋转

如何将三维pyplot轴放置在pyqt5上

我的例子是:

import matplotlib.pyplot as plt
from matplotlib.figure import Figure
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas

def spRDM_frame(self):
    fig = Figure()

    # note spRDM_Widget is the widget object on qt designer.
    self.ui.spRDM_Widget.canvas = FigureCanvas(fig)
    self.ui.spRDM_Widget.canvas.axes = self.ui.spRDM_Widget.canvas.figure.add_subplot(1,1,1, projection='3d')
    
    X = np.arange(-5, 5, 0.25)
    Y = np.arange(-5, 5, 0.25)
    X, Y = np.meshgrid(X, Y)
    R = np.sqrt(X ** 2 + Y ** 2)
    Z = np.sin(R)

    self.ui.spRDM_Widget.canvas.axes.plot(X,Y,Z)
    self.ui.spRDM_Widget.canvas.draw()

在样本中,不是我想要的

如何更改pyqt5上的pyplot和设置

非常感谢大家


Tags: importselfbackenduimatplotlibnp绘制widget
1条回答
网友
1楼 · 发布于 2024-10-01 00:36:24

可以使用Figure容器在FigureCanvasQTAgg画布上绘制三维轴。代码中的一个问题是axes3d.plot期望x、y和z坐标的1D数组作为输入参数,但您提供的是2D数组。要使此代码正常工作,您需要使用类似axes3d.plot_surfaceaxes3D.plot_wireframe的内容,例如

from PyQt5 import QtWidgets
from matplotlib.figure import Figure
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
import numpy as np

class Widget(QtWidgets.QWidget):
    def __init__(self):
        super().__init__()
        self.fig = Figure()
        self.canvas = FigureCanvas(self.fig)
        self.axes = self.fig.add_subplot(111, projection='3d')

        layout = QtWidgets.QVBoxLayout(self)
        layout.addWidget(self.canvas)

        X = np.arange(-5, 5, 0.25)
        Y = np.arange(-5, 5, 0.25)
        X, Y = np.meshgrid(X, Y)
        R = np.sqrt(X ** 2 + Y ** 2)
        Z = np.sin(R)

        self.axes.plot_surface(X, Y, Z)


if __name__ == "__main__":
    app = QtWidgets.QApplication([])
    win = Widget()
    win.show()
    app.exec()

相关问题 更多 >