【问题标题】:how to add the matplotlib 3d pyplot in python qt designer or pyqt5如何在 python qt 设计器或 pyqt5 中添加 matplotlib 3d pyplot
【发布时间】:2020-10-22 17:10:21
【问题描述】:

我的问题很简单但是找不到答案,大家可以帮帮我吗?

问题在python GUI pyqt5,我想用matplotlib画3d轴,我找到函数matplotlib.pyplot,mpl_toolkits.mplot3d可以做的很好,但是pyqt5只能用函数matplotlib.figure使用 matplotlib.backends.backend_qt5agg。

然后:

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

如何将 3d 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 和设置。

非常感谢。

【问题讨论】:

    标签: python matlab matplotlib pyqt5 qt-designer


    【解决方案1】:

    可以使用Figure 容器在FigureCanvasQTAgg 画布上绘制3D 轴。您的代码的一个问题是 axes3d.plot 期望 x、y 和 z 坐标的一维数组作为输入参数,但您提供的是二维数组。要使此代码正常工作,您需要改用 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()
    

    【讨论】:

    • 感谢Heike,我成功解决了这个问题,有两个重点,一个是plot_surface,你是对的。我将绘图更改为 plot_surface。还有一点就是layout,我没有把self.fig放到layout里面。
    • 当我改变这两个点时,我可以使用 FigureCanvas(pyplot.figure()) 来绘制 3d 轴。谢谢。
    猜你喜欢
    • 2021-01-02
    • 2023-03-16
    • 2011-08-31
    • 2016-04-28
    • 2020-04-05
    • 2016-07-27
    • 2016-10-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多