[PYTHON] 3D-Streudiagramm mit PyQtGraph

Mit PyQtGraph habe ich die GUI des 3D-Plots herausgefordert. Für diejenigen, die es noch nie gemacht haben, dachte ich, es sei ein harter Job, also schrieb ich es auf. Ich habe es unter Windows gemacht.

Ich werde zuerst den Code schreiben, aber ** wenn Sie es nicht können, lesen Sie unten. ** Vielleicht enthält es einfach kein OpenGL (pyopengl).

Vorerst

Speichern Sie den folgenden Code als Datei wie home a.py und führen Sie ihn mit Python a.py aus. Ich beabsichtige, es mit einer möglichst einfachen Struktur zu versuchen.

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

Was Sie brauchen OpenGL

Zum Zeitpunkt des Schreibens weiß ich nicht, was OpenGL ist. Bei Verwendung der 3DCG-Software wird erkannt, dass ein Kontrollkästchen wie OpenGL angezeigt wird.

python -m pyqtgraph.example

Auch wenn Sie im Launcher von "3D-Grafik> Streudiagramm" auswählen Ich habe nur einen Fehler bekommen. Ich erhalte den folgenden Fehler.

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

Es gibt kein Modul namens OpenGL.GL ... Lassen Sie uns in der Befehlszeile Folgendes tun. Der Name ist übrigens nicht OpenGL, sondern Pyopengl in allen Kleinbuchstaben.

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

Diesmal ist es geschafft. 20161117 03.png Das Bild oben ist ein Beispiel, das mit PyQt Graph geliefert wird. Es funktioniert in Echtzeit. Sie können den Code auch im Beispielstarter überprüfen.

pip muss die neueste Version sein

python -m pip install --upgrade pip

Machen wir das. Ich habe es nicht getan, daher habe ich den folgenden Fehler erhalten.

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

3D-Streudiagramm mit PyQtGraph
3D-Plot mit Matplotlib
Erstellen Sie ein 3D-Streudiagramm mit SciPy + matplotlib (Python)
(Memorandum) Erstellen Sie mit matplodlib ein 3D-Streudiagramm
Kontinuierliche Farbe mit Matplotlib-Streudiagramm
2-Achsen-Plot mit Matplotlib
2D-Plot in Matplotlib
3D oder D mit Py
Erstellen Sie mit PyQt5 und PyQtGraph einen 3D-Modell-Viewer
Zeichnen Sie ein Diagramm mit PyQtGraph Teil 2 - Detaillierte Ploteinstellungen
[Python] Wie zeichnet man mit Matplotlib ein Streudiagramm?
Seaborn-Grundlagen für Anfänger ③ Streudiagramm (Jointplot) * Mit Histogramm
Spielen wir mit der 4. Dimension der 4. Dimension
Kerzendiagrammplot mit Plotly
Erstellen Sie ein 3D-GIF mit Python3
Stapelbares Barplot mit Matplotlib
Interaktives Diagramm eines 3D-Diagramms
Anzeigen von Legendenmarkierungen in einem mit Python 2D-Plot
Forschungs- und Entwicklungsleben mit iPython Notebook
Erstellen Sie eine Plotanimation mit Python + Matplotlib
Zeichne ein Diagramm mit Julia + PyQtGraph (2)
Dreidimensionale Skelettstrukturanalyse mit Python
Löse ABC166 A ~ D mit Python
Zeichne ein Diagramm mit Julia + PyQtGraph (1)
Zeichne ein Diagramm mit Julia + PyQtGraph (3)
3D-Zeichnung mit SceneKit in Pythonista
Führen Sie mit Python, matplotlib, einen logarithmischen Normalwahrscheinlichkeitsplot durch