python - Matplotlib 显示页面上的滚动条

标签 python python-2.7 matplotlib anaconda

我想知道是否有一种方法可以在包含多个子批处理(sublot2grid)的 matplotlib 显示页面(plt.show)上放置滚动条(水平或垂直) >).目前,我找到的唯一解决方案是让子图非常小,这一点也不优雅。

最佳答案

显示 matplotlib 图的窗口没有添加滚动条的选项。它会自动将自身调整为图形大小。反之,如果调整大小,图形也会调整大小。

一种选择是构建一个具有此功能的自定义窗口。为此,可以使用 PyQt。下面给出了一个示例,其中不是调用 plt.show() 而是调用自定义类,并将要绘制的图形作为参数。图形大小应预先设置为图形 fig 并且自定义类不会更改它。相反,它将图形放入带有滚动条的 Canvas 中,以便图形保持其原始大小并且可以在 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)


虽然这个答案展示了一种滚动完整图形的方法,但如果您对滚动轴的内容感兴趣,请查看 this answer

关于python - Matplotlib 显示页面上的滚动条,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42622146/

相关文章:

python - 带小数点的 openpyxl 格式化单元格

python - 在 map 上绘制洋流数据 : Too many value to unpack error

python - 使用固定字符在 Z3 中定义位向量

python - 类型错误: 'float' 对象无法解释为整数

python - 为什么不总是设置框架宽度/高度?

pandas - 在 pandas barplot 中的每个子组中的条形之间添加空格

python - 如何在 python 中为子图运行智能循环

python - 除非其宽度与父级的宽度匹配,否则标签不会在左侧对齐

python - for else语句用法及含义

python - 如何转义特殊字符以使用 LXML 编写 XML