71565


pyqt5でAxe3Dを使って3dプロットをしたいです。Axe3Dで書いたグラフでは左クリックしながらドラッグで視点変更、右クリックしながら上下のドラッグでスケール変更が出来ます。ここで、グラフのキャンバスに機能を追加しようと思い、キャンバスを別クラスで記述しようとしました。その際、Axes3Dに本来ついていたマウスドラックでの視点やスケール変更の機能が失われてしまいました。下のGUIでは左側のキャンバスではマウスドラッグの機能が残っていますが、右のグラフではその機能は失われてしまい、ドラッグしても反応は有りませんでした。何がいけなかったのでしょうか。matplotlibのバージョンは3.1.3です。

* * *

**表示されるGUI**  
[![画像](https://i.stack.imgur.com/4XBi0.png)](https://i.stack.imgur.com/4XBi0.png)

**ソースコード**

[code]

    import sys
    from PyQt5.QtWidgets import QDialog, QApplication, QVBoxLayout, QHBoxLayout
    from matplotlib.figure import Figure
    import numpy as np
    import matplotlib.pyplot as plt
    from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
    from matplotlib.backends.backend_qt5 import NavigationToolbar2QT as NavigationToolbar
    from mpl_toolkits.mplot3d import Axes3D
    from PyQt5.QtCore import Qt, QTimer, QPoint
    from PyQt5.QtGui import QCursor
    
    class MyCanvas(FigureCanvas):
        #def __init__(self, parent=None, width=5, height=4, dpi=100):
        def __init__(self, parent=None):
            width=6
            height=6
            dpi=100
    
            self.color="#ffffff"
            
            self.fig = plt.figure(figsize=(width, height), dpi=dpi)
            #self.fig = plt.figure(figsize=plt.figaspect(0.5))
    
            self.axes = Axes3D(self.fig)
            self.canvas = FigureCanvas(self.fig)
            self.canvas.setFixedSize(600,450)
            
            FigureCanvas.__init__(self, self.fig)
            self.setParent(parent)
    
    
    class MyStaticMplCanvas(MyCanvas):
        def __init__(self, parent=None):
            self.win=parent 
            super(MyStaticMplCanvas,self).__init__(parent)
            #self.setFocusPolicy(Qt.StrongFocus)
            #self.setAcceptDrops(True) 
            self.win2=super(MyStaticMplCanvas,self)
    
    
    class Main(QDialog):
        def __init__(self, parent=None):
            super(Main, self).__init__(parent)
    
            self.figure = plt.figure(figsize=plt.figaspect(0.5))        
            self.canvas = FigureCanvas(self.figure)
            self.axes = Axes3D(self.figure)
            self.plot()
            
            self.canvas2 = MyStaticMplCanvas(self)
            self.plot2()       
    
            layout1=QHBoxLayout()
            layout1.addWidget(self.canvas)
            layout1.addWidget(self.canvas2)
            self.setLayout(layout1)
    
            self.show()
            
        def plot(self):
            x = np.arange(-3, 3, 0.25)
            y = np.arange(-3, 3, 0.25)
            X, Y = np.meshgrid(x, y)
            Z = np.sin(X)+ np.cos(Y)
            
            self.axes.plot_surface(X,Y,Z,cmap='jet')
            self.axes.set_xlabel("x")
            self.axes.set_ylabel("y")
            self.axes.set_zlabel("z")
            
            self.canvas.draw()
            
        def plot2(self):
            x = np.arange(-3, 3, 0.25)
            y = np.arange(-3, 3, 0.25)
            X, Y = np.meshgrid(x, y)
            Z = np.sin(X)+ np.cos(Y)
            
            self.canvas2.axes.plot_surface(X,Y,Z,cmap='jet')
            self.canvas2.axes.set_xlabel("x")
            self.canvas2.axes.set_ylabel("y")
            self.canvas2.axes.set_zlabel("z")
            
            self.canvas2.draw()
            
    if __name__ == '__main__':
        app = QApplication(sys.argv)
        win = Main()
        #sys.exit(app.exec_())
        app.exec_()
    
[/code]


CC BY-SA 4.0
2020-10-27T07:47:41.677
71536
2020-10-28T16:09:56.953
2020-10-28T16:09:56.953
26370
26529
question
python matplotlib pyqt5
pyqt5でAxe3Dを使ったときに、マウスでの視点変更やスケール変更がうまく行かない


後々どうなるかわかりませんが、今は取り敢えず以下部分の変更で、両方のグラフが操作できるようになります。

  * `class MyCanvas(FigureCanvas):`の中で、`self.axes = Axes3D(self.fig)`の処理を`canvas`関連処理の後(現在は`self.setParent(parent)`の後)に移動する。

`class Main(QDialog):`の中で最初のグラフ用の処理が`canvas`→`Axes3D`の順になっていたので合わせてみました。

[code]

    class MyCanvas(FigureCanvas):
        #def __init__(self, parent=None, width=5, height=4, dpi=100):
        def __init__(self, parent=None):
            width=6
            height=6
            dpi=100
    
            self.color="#ffffff"
            
            self.fig = plt.figure(figsize=(width, height), dpi=dpi)
            #self.fig = plt.figure(figsize=plt.figaspect(0.5))
    
            #### self.axes = Axes3D(self.fig) # ここでは行わない
            self.canvas = FigureCanvas(self.fig)
            self.canvas.setFixedSize(600,450)
            
            FigureCanvas.__init__(self, self.fig)
            self.setParent(parent)
    
            self.axes = Axes3D(self.fig) #### こちらに移動する
    
[/code]


CC BY-SA 4.0
2020-10-28T14:37:43.873
71565
2020-10-28T16:09:27.293
2020-10-28T16:09:27.293
26370
26370
71536
answer