Прозрачная панель навигации в Matplotlib (или можно добавить кнопки навигации без панели?)

Я пытаюсь максимально использовать пространство в графическом интерфейсе Qt со встроенной фигурой matplotlib, включая стандартную панель навигации matplotlib, чтобы предоставить пользователю полезные функции (масштабирование, сохранение, перемещение и т. Д.)

К сожалению, NavigationBar занимает много места, когда окно графика имеет широкоэкранное соотношение, как показано ниже. Все кнопки находятся слева, но NavigationBar также создает целую полосу пустого пространства. введите описание изображения здесь

Хотя мое предполагаемое приложение встраивает фигуру matplotlib в графический интерфейс Qt, я считаю, что это общий вопрос, который также может относиться к стандартному рисунку, отображаемому с помощью операции по умолчанию matplotlib ax.plot.

Возможно ли использовать это пространство? Я попытался установить текстовые и mpl виджеты здесь, но они всегда скрыты за панелью навигации. Возможно, есть настройка, чтобы сделать цвет этой полосы прозрачным?

В качестве альтернативы, есть ли быстрый способ добавить кнопки в качестве виджетов на мою фигуру, поэтому панель навигации не нужна. Мне нравится стиль и функциональность, предлагаемые этой панелью, поэтому я бы предпочел не повторять каждую из них вручную.

Благодарю.

1 ответ

Решение

NavigationToolbar это нормально QWidget, Это означает, что вы можете делать с ним все то же, что и с другими виджетами, включая

  • поместив его в макеты других виджетов
  • положить его в меню
  • изменить его макет
  • поместите его абсолютно внутри графического интерфейса
  • так далее...

Вопрос слишком широкий, чтобы предложить решения для всех этих проблем; но также доступно достаточно ресурсов для манипулирования и позиционирования виджетов в PyQt.

Ниже приведен пример для абсолютно позиционированного NavigationToolbar, который (по умолчанию) прозрачен. Панель инструментов расположена в начале координат осей и останется там, если изменить размер фигуры.

GUI с прозрачной навигационной панелью инструментов

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 Window(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.canvas.mpl_connect("resize_event", self.resize)

        self.widget.layout().addWidget(self.canvas)

        self.nav = NavigationToolbar(self.canvas, self.widget, coordinates=False)
        self.nav.setMinimumWidth(300)
        self.nav.setStyleSheet("QToolBar { border: 0px }")

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

    def resize(self, event):
        # on resize reposition the navigation toolbar to (0,0) of the axes.
        x,y = self.fig.axes[0].transAxes.transform((0,0))
        figw, figh = self.fig.get_size_inches()
        ynew = figh*self.fig.dpi-y - self.nav.frameGeometry().height()
        self.nav.move(x,ynew)

# create a figure with a subplot
fig, ax = plt.subplots(figsize=(5,3))
# colorize figure and axes to make transparency obvious
fig.set_facecolor("#e9c9ef") 
ax.set_facecolor("#f7ecf9")
ax.plot([2,3,5,1], color="#ab39c1")
fig.tight_layout()

# pass the figure to the custom window
a = Window(fig)
Другие вопросы по тегам