Matplotlib中的透明导航栏(或者,可以在没有导航栏的情况下添加导航按钮?)

Matplotlib中的透明导航栏(或者,可以在没有导航栏的情况下添加导航按钮?),matplotlib,pyqt,qt5,toolbar,matplotlib-widget,Matplotlib,Pyqt,Qt5,Toolbar,Matplotlib Widget,我正试图通过嵌入matplotlib图形最大限度地利用Qt GUI中的空间,包括标准matplotlib导航栏,为用户提供有用的功能(缩放、保存、移动等) 不幸的是,当绘图窗口具有“宽屏”比率时,导航栏最终会占用大量空间,如下所示。所有按钮都在左侧,但导航栏也会创建一整条空白。 虽然我的预期应用程序是在Qt GUI中嵌入matplotlib图形,但我相信这是一个一般性问题,也适用于默认matplotlib ax.plot操作显示的标准图形 可以使用这个空间吗?我尝试在这里设置文本和mpl小部件

我正试图通过嵌入matplotlib图形最大限度地利用Qt GUI中的空间,包括标准matplotlib导航栏,为用户提供有用的功能(缩放、保存、移动等)

不幸的是,当绘图窗口具有“宽屏”比率时,导航栏最终会占用大量空间,如下所示。所有按钮都在左侧,但导航栏也会创建一整条空白。

虽然我的预期应用程序是在Qt GUI中嵌入matplotlib图形,但我相信这是一个一般性问题,也适用于默认matplotlib ax.plot操作显示的标准图形

可以使用这个空间吗?我尝试在这里设置文本和mpl小部件,但它们总是隐藏在导航栏后面。也许有一个设置,使这个酒吧的颜色透明

或者,有没有一种快速的方法将按钮作为小部件添加到我的图中,这样就不需要导航栏了。我喜欢酒吧提供的风格和功能,因此不必手动重新实现每一个


谢谢。

导航工具栏是一个普通的
QWidget
。这意味着你可以用它做任何你也可以用其他小部件做的事情,包括

  • 将其放入其他小部件的布局中
  • 将其放入菜单中
  • 改变它的布局
  • 将其绝对放置在GUI中
  • 等等
这个问题有点过于宽泛,无法为所有这些问题提供解决方案;但关于如何在PyQt中操作和定位小部件,也有足够的资源可用

下面是一个绝对定位的
导航工具栏
,默认情况下是透明的。工具栏位于轴的原点,如果调整图形的大小,工具栏将保持不变


谢谢-这可以很好地将导航栏定位在GUI中更紧凑的位置。作为一个关注点,是否有可能在其他层的顶部覆盖这个(即通常的Qt小部件),理想情况下也包括一些透明度?为什么不尝试一下,如果它不起作用,更新您的问题并提供清晰的问题描述?我仔细查看了这一点,并在更新的答案中提供了一个完整的示例。我试图实现这一点,但它的工作效果不如代码示例。非常感谢!
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)