Полоса прокрутки на странице Matplotlib

Вопрос: Я хочу знать, есть ли способ разместить полосу прокрутки (горизонтальную или вертикальную) на странице matplotlib, показывающей страницу (plt.show), которая содержит несколько sublot2grid (sublot2grid). На данный момент единственное решение, которое я нахожу, - сделать подсети очень маленькими, что совсем не очень элегантно. Лучший ответ: В окне с рисунком matplotlib нет возможности добавлять полосы прокрутки. Он

Вопрос:

Я хочу знать, есть ли способ разместить полосу прокрутки (горизонтальную или вертикальную) на странице matplotlib, показывающей страницу (plt.show), которая содержит несколько sublot2grid (sublot2grid). На данный момент единственное решение, которое я нахожу, – сделать подсети очень маленькими, что совсем не очень элегантно.

Лучший ответ:

В окне с рисунком 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)

Вот версия для 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)

Хотя в этом ответе показан способ прокрутки всей фигуры, если вы заинтересованы в прокрутке содержимого осей, проверьте этот ответ.

Оцените статью
Добавить комментарий