簡體   English   中英

PyQt5 嵌入 3D 散點圖

[英]PyQt5 embedding a 3D scatter plot

我試圖在 PyQt5 中使用 3D 繪圖,但我無法使繪圖的旋轉工作。 我已經讓 matplotlib 工具欄工作了一半,它可以保存和調整繪圖大小。 縮放和移動不起作用,盡管它可以使用 2d 圖,但不確定散點圖是否允許縮放或移動。 我需要的是旋轉工作。

到目前為止的代碼:

import sys
from PyQt5.QtWidgets import QWidget, QMainWindow, QApplication, QSizePolicy, QVBoxLayout, QPushButton
import matplotlib
matplotlib.use("Qt5Agg")

from matplotlib.backends.backend_qt5agg import NavigationToolbar2QT as NavigationToolbar
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.figure import Figure

from mpl_toolkits.mplot3d import axes3d, Axes3D



class MyMplCanvas(FigureCanvas):
    # Ultimately, this is a QWidget (as well as a FigureCanvasAgg, etc.).
    def __init__(self, parent=None, width=5, height=4, dpi=100):
        fig = Figure(figsize=(width, height), dpi=dpi)
        self.fig = fig
        self.axes = fig.add_subplot(111, projection='3d')
        # self.fig = plt.figure()
        # self.axes = Axes3D(self.fig)

        self.compute_initial_figure()
        FigureCanvas.__init__(self, self.fig)
        self.setParent(parent)

        FigureCanvas.setSizePolicy(self,
                                   QSizePolicy.Expanding,
                                   QSizePolicy.Expanding)
        FigureCanvas.updateGeometry(self)

    def compute_initial_figure(self):
        pass


class MyStaticMplCanvas(MyMplCanvas):
    # Simple canvas with a sine plot.
    def compute_initial_figure(self):
        # t = arange(0.0, 3.0, 0.01)
        # s = sin(2 * pi * t)
        # self.axes.plot(t, s)
        xs = [1, 2]
        ys = [1, 2]
        zs = [1, 2]

        self.axes.scatter(xs, ys, zs, c='b')

        self.axes.mouse_init()


class PlotDialog(QWidget):
    def __init__(self):
        QWidget.__init__(self)

        self.plot_layout = QVBoxLayout(self)
        self.plot_canvas = MyStaticMplCanvas(self, width=5, height=4, dpi=100)

        self.navi_toolbar = NavigationToolbar(self.plot_canvas, self)
        self.plot_layout.addWidget(self.plot_canvas)  # the matplotlib canvas
        self.plot_layout.addWidget(self.navi_toolbar)


if __name__ == "__main__":
    import sys

    app = QApplication(sys.argv)
    dialog = PlotDialog()
    dialog.show()
    sys.exit(app.exec_())

您必須在更新幾何圖形后初始化鼠標,在您的情況下,您是在導致失敗之前執行它們。

# ...
FigureCanvas.setSizePolicy(self,
                           QSizePolicy.Expanding,
                           QSizePolicy.Expanding)
FigureCanvas.updateGeometry(self)
self.axes.mouse_init()
# ...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM