2017-03-06 156 views
2

いくつかのサブスロット(sublot2grid)を含むマットplotlibページ(plt.show)にスクロールバー(水平または垂直)を配置する方法があるかどうかを知りたいと思います。現時点では、私が見つける唯一の解決策は、サブプロットを非常に小さくすることです。それはあまりエレガントではありません。Matplotlib上のスクロールバー

答えて

6

matplotlibの図を示すウィンドウにはスクロールバーを追加するオプションがありません。それは自動的に図形サイズに自動的にサイズ変更されます。逆に、サイズを変更すると、Figureのサイズも変更されます。

オプションはになります。この機能を持つカスタムウィンドウを作成します。その目的のために、PyQtを使うことができます。次の例では、plt.show()を呼び出すのではなく、カスタムクラスを呼び出してFigureとして引数として描画します。図形のサイズは数字figの手前に設定する必要があり、そのカスタムクラスはそれを変更しません。代わりに、スクロールバーを使ってFigureをキャンバスに配置します。Figureは元のサイズを保持し、Qtウィンドウ内でスクロールできます。あなたはクラス内の詳細を処理する必要はありませんが、スクリプトの最後には呼び出しのみを処理する必要はありません。

この例は、PyQt4です(下のPyQt5の例を参照)。ここで

import matplotlib.pyplot as plt 
from PyQt4 import QtGui 
from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg as FigureCanvas 
from matplotlib.backends.backend_qt4agg import NavigationToolbar2QT as NavigationToolbar 

class ScrollableWindow(QtGui.QMainWindow): 
    def __init__(self, fig): 
     self.qapp = QtGui.QApplication([]) 

     QtGui.QMainWindow.__init__(self) 
     self.widget = QtGui.QWidget() 
     self.setCentralWidget(self.widget) 
     self.widget.setLayout(QtGui.QVBoxLayout()) 
     self.widget.layout().setContentsMargins(0,0,0,0) 
     self.widget.layout().setSpacing(0) 

     self.fig = fig 
     self.canvas = FigureCanvas(self.fig) 
     self.canvas.draw() 
     self.scroll = QtGui.QScrollArea(self.widget) 
     self.scroll.setWidget(self.canvas) 

     self.nav = NavigationToolbar(self.canvas, self.widget) 
     self.widget.layout().addWidget(self.nav) 
     self.widget.layout().addWidget(self.scroll) 

     self.show() 
     exit(self.qapp.exec_()) 


# create a figure and some subplots 
fig, axes = plt.subplots(ncols=4, nrows=5, figsize=(16,16)) 
for ax in axes.flatten(): 
    ax.plot([2,3,5,1]) 

# pass the figure to the custom window 
a = ScrollableWindow(fig) 

enter image description here


PyQt5ためのバージョンです。

import matplotlib 
# Make sure that we are using QT5 
matplotlib.use('Qt5Agg') 
import matplotlib.pyplot as plt 
from PyQt5 import QtWidgets 
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas 
from matplotlib.backends.backend_qt5agg import NavigationToolbar2QT as NavigationToolbar 


class ScrollableWindow(QtWidgets.QMainWindow): 
    def __init__(self, fig): 
     self.qapp = QtWidgets.QApplication([]) 

     QtWidgets.QMainWindow.__init__(self) 
     self.widget = QtWidgets.QWidget() 
     self.setCentralWidget(self.widget) 
     self.widget.setLayout(QtWidgets.QVBoxLayout()) 
     self.widget.layout().setContentsMargins(0,0,0,0) 
     self.widget.layout().setSpacing(0) 

     self.fig = fig 
     self.canvas = FigureCanvas(self.fig) 
     self.canvas.draw() 
     self.scroll = QtWidgets.QScrollArea(self.widget) 
     self.scroll.setWidget(self.canvas) 

     self.nav = NavigationToolbar(self.canvas, self.widget) 
     self.widget.layout().addWidget(self.nav) 
     self.widget.layout().addWidget(self.scroll) 

     self.show() 
     exit(self.qapp.exec_()) 


# create a figure and some subplots 
fig, axes = plt.subplots(ncols=4, nrows=5, figsize=(16,16)) 
for ax in axes.flatten(): 
    ax.plot([2,3,5,1]) 

# pass the figure to the custom window 
a = ScrollableWindow(fig) 
+0

感謝がたくさんだ、これは私が「バックTkinterのに行くんどのようなバックTkinterのインタフェース、アプリケーションがクラッシュし、 –

+0

を探していますものですインターフェイス "とはどういう意味ですか? –

+0

へ行くためにQtのウィンドウを閉じたときに、私は、問題を抱えている^^ – ImportanceOfBeingErnest

関連する問題