[PYTHON] Nuage de points 3D avec PyQtGraph

En utilisant PyQtGraph, j'ai défié l'interface graphique du tracé 3D. Pour ceux qui ne l'ont jamais fait, je pensais que c'était un travail difficile, alors je l'ai noté. Je l'ai fait sous Windows.

Je vais d'abord écrire le code, mais ** si vous ne pouvez pas le faire, lisez ci-dessous. ** Peut-être que cela n'inclut tout simplement pas OpenGL (pyopengl).

Pour le moment

Enregistrez le code suivant dans un fichier tel que home a.py et exécutez-le avec python a.py. J'ai l'intention de l'essayer avec une structure aussi simple que possible.

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


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(777, 777)
        self.centralwidget = QtGui.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        MainWindow.setCentralWidget(self.centralwidget)
        
        self.verticalLayout = QtGui.QVBoxLayout(self.centralwidget)
        self.verticalLayout.setObjectName("verticalLayout")

        self.graph = gl.GLViewWidget(self.centralwidget)
        self.graph.setObjectName("graph")
        self.verticalLayout.addWidget(self.graph)

        self.graph.opts['distance'] = 30
        self.graph.show()
        self.g = gl.GLGridItem()
        self.graph.addItem(self.g)

        self.n=1
        numX, startX, endX = self.n, -1, 1+self.n
        numY, startY, endY = self.n, -1, 1+self.n
        numZ, startZ, endZ = self.n, -1, 1+self.n
        
        X = np.linspace(startX, endX, numX)
        Y = np.linspace(startY, endY, numY)
        Z = np.linspace(startZ, endZ, numZ)

        #position of scatter in 3D
        pos = np.array([[i,j,k] for i in X for j in Y for k in Z])

        color = (1,1,1,1)
        size = 0.5

        self.scttrPlt = gl.GLScatterPlotItem(pos=pos, size=size, color=color, pxMode=False)
        self.scttrPlt.translate(5,5,0)
        self.graph.addItem(self.scttrPlt)

        self.psbtn = QtGui.QPushButton(self.centralwidget)
        self.psbtn.setObjectName("psbtn")
        self.psbtn.setText("Plot")
        self.verticalLayout.addWidget(self.psbtn)

        QtCore.QObject.connect(self.psbtn, QtCore.SIGNAL("clicked()"), self.plot)

    def plot(self):
        self.n+=1
        numX, startX, endX = self.n, -1, 1+self.n
        numY, startY, endY = self.n, -1, 1+self.n
        numZ, startZ, endZ = self.n, -1, 1+self.n
        
        X = np.linspace(startX, endX, numX)
        Y = np.linspace(startY, endY, numY)
        Z = np.linspace(startZ, endZ, numZ)

        pos = np.array([[i,j,k] for i in X for j in Y for k in Z])
        color = (1,1,1,1)
        size = 0.5

        self.scttrPlt.setData(pos=pos,color=color,size=size)


pg.setConfigOption('foreground', 'k')
pg.setConfigOption('background', 'w')


class ControlMainWindow(QtGui.QMainWindow):
    def __init__(self, parent=None):
        super(ControlMainWindow, self).__init__(parent)
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)

if __name__ == "__main__":
    app = QtGui.QApplication(sys.argv)
    mySW = ControlMainWindow()
    mySW.show()
    sys.exit(app.exec_())

20161117 04.png

Ce dont vous avez besoin OpenGL

Au moment d'écrire ceci, je ne sais pas ce qu'est OpenGL. Lors de l'utilisation du logiciel 3DCG, il est reconnu qu'une case à cocher telle que OpenGL apparaît.

python -m pyqtgraph.example

Même si vous sélectionnez "Graphiques 3D> Nuage de points" dans le lanceur de J'ai seulement eu une erreur. J'obtiens l'erreur suivante.

E:\hoge>python -m pyqtgraph.examples
Using PySide (default graphics system)
Using PySide (default graphics system)
Traceback (most recent call last):
  File "C:\Python27\lib\site-packages\pyqtgraph\examples\GLScatterPlotItem.py", line 11, in <module>
    import pyqtgraph.opengl as gl
  File "C:\Python27\lib\site-packages\pyqtgraph\opengl\__init__.py", line 1, in <module>
    from .GLViewWidget import GLViewWidget
  File "C:\Python27\lib\site-packages\pyqtgraph\opengl\GLViewWidget.py", line 2, in <module>
    from OpenGL.GL import *
ImportError: No module named OpenGL.GL

Il n'y a pas de module nommé OpenGL.GL ... Faisons ce qui suit sur la ligne de commande. Au fait, le nom n'est pas OpenGL, mais pyopengl dans toutes les lettres minuscules.

pip install pyopengl
E:\hogehoge>pip install pyopengl
Collecting pyopengl
  Downloading PyOpenGL-3.1.0.tar.gz (1.2MB)
    100% |################################| 1.2MB 298kB/s
Building wheels for collected packages: pyopengl
  Running setup.py bdist_wheel for pyopengl ... done
  Stored in directory: C:\Users\yusuke\AppData\Local\pip\Cache\wheels\1c\17\50\f69d63e0a8169fb890f5a167817a73391be85d30e86fd29504
Successfully built pyopengl
Installing collected packages: pyopengl
Successfully installed pyopengl-3.1.0

Cette fois, c'est fait. 20161117 03.png L'image ci-dessus est un exemple fourni avec PyQt Graph. Cela fonctionne en temps réel. Vous pouvez également vérifier le code à partir du lanceur d'exemples.

pip doit être la dernière version

python -m pip install --upgrade pip

Faisons le. Je ne l'ai pas fait, alors j'ai eu l'erreur suivante.

E:\hoge>pip install pyopengl
Collecting OpenGL
  Could not find a version that satisfies the requirement OpenGL (from versions: )
No matching distribution found for OpenGL
You are using pip version 8.1.2, however version 9.0.1 is available.
You should consider upgrading via the 'python -m pip install --upgrade pip' command.

Recommended Posts

Nuage de points 3D avec PyQtGraph
Graphique 3D avec matplotlib
Créer un diagramme de dispersion 3D avec SciPy + matplotlib (Python)
(Mémorandum) Créer un diagramme de dispersion 3D avec matplodlib
Couleur en continu avec le diagramme de dispersion matplotlib
Graphique 2 axes avec Matplotlib
Graphique 2D dans matplotlib
3D ou D avec Py
Créer une visionneuse de modèle 3D avec PyQt5 et PyQtGraph
Dessinez un graphique avec PyQtGraph Partie 2 - Paramètres de tracé détaillés
[Python] Comment dessiner un diagramme de dispersion avec Matplotlib
Bases de Seaborn pour les débutants ③ Diagramme de dispersion (jointplot) * Avec histogramme
Jouons avec la 4e dimension 4e
Diagramme de bougie avec tracé
Créer un gif 3D avec python3
Bar plot empilable avec matplotlib
Tracé interactif du graphique 3D
Comment afficher les marques de légende en un avec le tracé Python 2D
La vie de recherche et développement avec le notebook iPython
Créer une animation de tracé avec Python + Matplotlib
Tracez un graphe avec Julia + PyQtGraph (2)
Analyse de la structure du squelette en trois dimensions avec Python
Résoudre ABC166 A ~ D avec Python
Tracez un graphique avec Julia + PyQtGraph (1)
Dessinez un graphique avec Julia + PyQtGraph (3)
Dessin 3D avec SceneKit dans Pythonista
Effectuer un tracé de probabilité normale logarithmique avec Python, matplotlib