2017-03-06 842 views
2

我想知道是否有方法在包含多个子插槽(sublot2grid)的matplotlib显示页面(plt.show)上放置滚动条(水平或垂直)。目前,我找到的唯一解决方案是让子图非常小,这根本不是很优雅。Matplotlib上的滚动条显示页面

回答

6

显示matplotlib图形的窗口没有添加滚动条的选项。它会自动调整自己的大小。相反,如果调整大小,该数字也将调整大小。

一个选项是建立一个自定义窗口它具有这种能力。为此,可以使用PyQt。下面给出一个例子,其中不是调用plt.show(),而是使用图形调用自定义类作为参数。数字大小应该先设置为图fig,并且该自定义类不会更改它。相反,它会将图形放入带滚动条的画布中,以便该图保留原始大小并可在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

感谢的很多,这是我期待的^^ –

+0

我有一个问题,当我关闭了Qt窗口回去Tkinter的接口,应用程序崩溃, –

+0

什么是“回去的Tkinter界面“的意思? – ImportanceOfBeingErnest