42673


pyqt5で表示したグラフを選択したフォルダーに保存したいです。まず、次のようなGUIを作成しました。  
[![画像1](https://i.stack.imgur.com/4b4ea.png)](https://i.stack.imgur.com/4b4ea.png)  
ここで、Saveのボタンを押したときに次のようなフォルダ選択ダイアログが出て、選んだフォルダ内にグラフが画像データとして保存されるようにしたいです。  
[![画像2](https://i.stack.imgur.com/3AtsH.png)](https://i.stack.imgur.com/3AtsH.png)

以下に、実際に書いたコードを載せます。

[code]

    import sys
    from PyQt5 import QtWidgets
    from PyQt5.QtWidgets import QFileDialog
    from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
    from matplotlib.backends.backend_qt5 import NavigationToolbar2QT as NavigationToolbar
    import matplotlib.pyplot as plt
    
    import random
    
    class Window(QtWidgets.QDialog):
        def __init__(self, parent=None):
            super().__init__(parent)
    
            self.figure = plt.figure()
            self.axes = self.figure.add_subplot(111)
            # We want the axes cleared every time plot() is called
            self.axes.hold(False)
            self.canvas = FigureCanvas(self.figure)
    
            self.toolbar = NavigationToolbar(self.canvas, self)
            self.toolbar.hide()
    
            # Just some button 
            self.button1 = QtWidgets.QPushButton('Plot')
            self.button1.clicked.connect(self.plot)
    
            self.button2 = QtWidgets.QPushButton('Save')
            self.button2.clicked.connect(self.save)
    
            # set the layout
            layout = QtWidgets.QVBoxLayout()
            layout.addWidget(self.toolbar)
            layout.addWidget(self.canvas)
    
            btnlayout = QtWidgets.QHBoxLayout()
            btnlayout.addWidget(self.button1)
            btnlayout.addWidget(self.button2)
            qw = QtWidgets.QWidget(self)
            qw.setLayout(btnlayout)
            layout.addWidget(qw)
    
            self.setLayout(layout)
    
        def save(self):
            filename=QFileDialog.getExistingDirectory(self,"save folda")
    
        def plot(self):
            ''' plot some random stuff '''
            data = [random.random() for i in range(25)]
            self.axes.plot(data, '*-')
            self.canvas.draw()
    
    if __name__ == '__main__':
        app = QtWidgets.QApplication(sys.argv)
    
        main = Window()
        main.show()
    
        sys.exit(app.exec_())
    
[/code]

しかし、46行目のSave関数の中の、フォルダ選択画面を出した後の書き方が分かりません。Plot関数の中でグラフを画像ファイルに直すことができれば、Save関数内で保存ができるような気もしますが、そのやり方も分かりません。


CC BY-SA 3.0
2018-03-27T08:15:50.520
42670
2018-04-30T04:53:37.890
2018-04-30T04:53:37.890
3060
26529
question
python python3 matplotlib pyqt
pyqt5で表示したグラフを任意のフォルダー内に保存したい


◇ディレクトリを選択して固定のファイル名で保存

[code]

    def save(self):
        from pathlib import Path
        file_name = QFileDialog.getExistingDirectory(self)
        if len(file_name) == 0:
            return
        file_name = str(Path(file_name, "plot.png"))
        self.figure.savefig(file_name)
    
[/code]

◇ファイル名を入力して保存

[code]

    def save(self):
        from pathlib import Path
        file_name, _ = QFileDialog.getSaveFileName(self)
        if len(file_name) == 0:
            return
        print(file_name)
        file_name = str(Path(file_name).with_suffix(".png"))
        print(file_name)
        self.figure.savefig(file_name)
    
[/code]

◇参考情報  
[pyplot#savefig](https://matplotlib.org/api/_as_gen/matplotlib.pyplot.savefig.html)  
[pathlib](https://docs.python.jp/3/library/pathlib.html)


CC BY-SA 3.0
2018-03-27T10:49:16.820
42673
2018-03-27T10:57:37.440
2018-03-27T10:57:37.440
21356
21356
42670
answer