diff options
Diffstat (limited to 'examples/external/matplotlib/widget_3dplot.py')
-rw-r--r-- | examples/external/matplotlib/widget_3dplot.py | 242 |
1 files changed, 0 insertions, 242 deletions
diff --git a/examples/external/matplotlib/widget_3dplot.py b/examples/external/matplotlib/widget_3dplot.py deleted file mode 100644 index b96405661..000000000 --- a/examples/external/matplotlib/widget_3dplot.py +++ /dev/null @@ -1,242 +0,0 @@ -############################################################################# -## -## Copyright (C) 2020 The Qt Company Ltd. -## Contact: https://www.qt.io/licensing/ -## -## This file is part of the Qt for Python examples of the Qt Toolkit. -## -## $QT_BEGIN_LICENSE:BSD$ -## You may use this file under the terms of the BSD license as follows: -## -## "Redistribution and use in source and binary forms, with or without -## modification, are permitted provided that the following conditions are -## met: -## * Redistributions of source code must retain the above copyright -## notice, this list of conditions and the following disclaimer. -## * Redistributions in binary form must reproduce the above copyright -## notice, this list of conditions and the following disclaimer in -## the documentation and/or other materials provided with the -## distribution. -## * Neither the name of The Qt Company Ltd nor the names of its -## contributors may be used to endorse or promote products derived -## from this software without specific prior written permission. -## -## -## THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -## "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -## LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -## A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -## OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -## LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -## DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -## THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -## (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -## OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." -## -## $QT_END_LICENSE$ -## -############################################################################# - -import sys - -import numpy as np -from matplotlib.backends.backend_qt5agg import FigureCanvas -from matplotlib.figure import Figure -from mpl_toolkits.mplot3d import axes3d -from PySide2.QtCore import Qt, Slot -from PySide2.QtGui import QKeySequence -from PySide2.QtWidgets import (QAction, QApplication, QComboBox, QHBoxLayout, - QHeaderView, QLabel, QMainWindow, QSlider, - QTableWidget, QTableWidgetItem, QVBoxLayout, - QWidget) - - -"""This example implements the interaction between Qt Widgets and a 3D -matplotlib plot""" - - -class ApplicationWindow(QMainWindow): - def __init__(self, parent=None): - QMainWindow.__init__(self, parent) - - self.column_names = ["Column A", "Column B", "Column C"] - - # Central widget - self._main = QWidget() - self.setCentralWidget(self._main) - - # Main menu bar - self.menu = self.menuBar() - self.menu_file = self.menu.addMenu("File") - exit = QAction("Exit", self, triggered=qApp.quit) - self.menu_file.addAction(exit) - - self.menu_about = self.menu.addMenu("&About") - about = QAction("About Qt", self, shortcut=QKeySequence(QKeySequence.HelpContents), - triggered=qApp.aboutQt) - self.menu_about.addAction(about) - - # Figure (Left) - self.fig = Figure(figsize=(5, 3)) - self.canvas = FigureCanvas(self.fig) - - # Sliders (Left) - self.slider_azim = QSlider(minimum=0, maximum=360, orientation=Qt.Horizontal) - self.slider_elev = QSlider(minimum=0, maximum=360, orientation=Qt.Horizontal) - - self.slider_azim_layout = QHBoxLayout() - self.slider_azim_layout.addWidget(QLabel("{}".format(self.slider_azim.minimum()))) - self.slider_azim_layout.addWidget(self.slider_azim) - self.slider_azim_layout.addWidget(QLabel("{}".format(self.slider_azim.maximum()))) - - self.slider_elev_layout = QHBoxLayout() - self.slider_elev_layout.addWidget(QLabel("{}".format(self.slider_elev.minimum()))) - self.slider_elev_layout.addWidget(self.slider_elev) - self.slider_elev_layout.addWidget(QLabel("{}".format(self.slider_elev.maximum()))) - - # Table (Right) - self.table = QTableWidget() - header = self.table.horizontalHeader() - header.setSectionResizeMode(QHeaderView.Stretch) - - # ComboBox (Right) - self.combo = QComboBox() - self.combo.addItems(["Wired", "Surface", "Triangular Surface", "Sphere"]) - - # Right layout - rlayout = QVBoxLayout() - rlayout.setContentsMargins(1, 1, 1, 1) - rlayout.addWidget(QLabel("Plot type:")) - rlayout.addWidget(self.combo) - rlayout.addWidget(self.table) - - # Left layout - llayout = QVBoxLayout() - rlayout.setContentsMargins(1, 1, 1, 1) - llayout.addWidget(self.canvas, 88) - llayout.addWidget(QLabel("Azimuth:"), 1) - llayout.addLayout(self.slider_azim_layout, 5) - llayout.addWidget(QLabel("Elevation:"), 1) - llayout.addLayout(self.slider_elev_layout, 5) - - # Main layout - layout = QHBoxLayout(self._main) - layout.addLayout(llayout, 70) - layout.addLayout(rlayout, 30) - - # Signal and Slots connections - self.combo.currentTextChanged.connect(self.combo_option) - self.slider_azim.valueChanged.connect(self.rotate_azim) - self.slider_elev.valueChanged.connect(self.rotate_elev) - - # Initial setup - self.plot_wire() - self._ax.view_init(30, 30) - self.slider_azim.setValue(30) - self.slider_elev.setValue(30) - self.fig.canvas.mpl_connect("button_release_event", self.on_click) - - # Matplotlib slot method - def on_click(self, event): - azim, elev = self._ax.azim, self._ax.elev - self.slider_azim.setValue(azim + 180) - self.slider_elev.setValue(elev + 180) - - # Utils methods - - def set_table_data(self, X, Y, Z): - for i in range(len(X)): - self.table.setItem(i, 0, QTableWidgetItem("{:.2f}".format(X[i]))) - self.table.setItem(i, 1, QTableWidgetItem("{:.2f}".format(Y[i]))) - self.table.setItem(i, 2, QTableWidgetItem("{:.2f}".format(Z[i]))) - - def set_canvas_table_configuration(self, row_count, data): - self.fig.set_canvas(self.canvas) - self._ax = self.canvas.figure.add_subplot(projection="3d") - - self._ax.set_xlabel(self.column_names[0]) - self._ax.set_ylabel(self.column_names[1]) - self._ax.set_zlabel(self.column_names[2]) - - self.table.setRowCount(row_count) - self.table.setColumnCount(3) - self.table.setHorizontalHeaderLabels(self.column_names) - self.set_table_data(data[0], data[1], data[2]) - - # Plot methods - - def plot_wire(self): - # Data - self.X, self.Y, self.Z = axes3d.get_test_data(0.03) - - self.set_canvas_table_configuration(len(self.X[0]), (self.X[0], self.Y[0], self.Z[0])) - self._ax.plot_wireframe(self.X, self.Y, self.Z, rstride=10, cstride=10, cmap="viridis") - self.canvas.draw() - - def plot_surface(self): - # Data - self.X, self.Y = np.meshgrid(np.linspace(-6, 6, 30), np.linspace(-6, 6, 30)) - self.Z = np.sin(np.sqrt(self.X ** 2 + self.Y ** 2)) - - self.set_canvas_table_configuration(len(self.X[0]), (self.X[0], self.Y[0], self.Z[0])) - self._ax.plot_surface(self.X, self.Y, self.Z, - rstride=1, cstride=1, cmap="viridis", edgecolor="none") - self.canvas.draw() - - def plot_triangular_surface(self): - # Data - radii = np.linspace(0.125, 1.0, 8) - angles = np.linspace(0, 2 * np.pi, 36, endpoint=False)[..., np.newaxis] - self.X = np.append(0, (radii * np.cos(angles)).flatten()) - self.Y = np.append(0, (radii * np.sin(angles)).flatten()) - self.Z = np.sin(-self.X * self.Y) - - self.set_canvas_table_configuration(len(self.X), (self.X, self.Y, self.Z)) - self._ax.plot_trisurf(self.X, self.Y, self.Z, linewidth=0.2, antialiased=True) - self.canvas.draw() - - def plot_sphere(self): - # Data - u = np.linspace(0, 2 * np.pi, 100) - v = np.linspace(0, np.pi, 100) - self.X = 10 * np.outer(np.cos(u), np.sin(v)) - self.Y = 10 * np.outer(np.sin(u), np.sin(v)) - self.Z = 9 * np.outer(np.ones(np.size(u)), np.cos(v)) - - self.set_canvas_table_configuration(len(self.X), (self.X[0], self.Y[0], self.Z[0])) - self._ax.plot_surface(self.X, self.Y, self.Z) - self.canvas.draw() - - # Slots - - @Slot() - def combo_option(self, text): - if text == "Wired": - self.plot_wire() - elif text == "Surface": - self.plot_surface() - elif text == "Triangular Surface": - self.plot_triangular_surface() - elif text == "Sphere": - self.plot_sphere() - - @Slot() - def rotate_azim(self, value): - self._ax.view_init(self._ax.elev, value) - self.fig.set_canvas(self.canvas) - self.canvas.draw() - - @Slot() - def rotate_elev(self, value): - self._ax.view_init(value, self._ax.azim) - self.fig.set_canvas(self.canvas) - self.canvas.draw() - - -if __name__ == "__main__": - app = QApplication(sys.argv) - w = ApplicationWindow() - w.setFixedSize(1280, 720) - w.show() - app.exec_() |