Matplotlib 中的透明导航栏(或者,可以在没有栏的情况下添加导航按钮吗?)
Transparent NavigationBar in Matplotlib (or, can the Navigation buttonsbe added without a bar?)
我正在尝试在带有嵌入式 matplotlib 图形的 Qt GUI 中最大限度地利用 space,包括标准的 matplotlib 导航栏以为用户提供有用的功能(缩放、保存、移动等)
不幸的是,当绘图 window 的比例为 'widescreen' 时,NavigationBar 最终占用了大量 space,如下所示。所有按钮都在左侧,但 NavigationBar 也创建了一整条白色 space。
虽然我的预期应用程序是在 Qt GUI 中嵌入 matplotlib 图,但我相信这是一个普遍问题,也适用于默认 matplotlib ax.plot 操作显示的标准图。
可以使用这个space吗?我尝试在这里设置文本和 mpl 小部件,但它们总是隐藏在导航栏后面。也许有一个设置可以使这个栏的颜色透明?
或者,是否有一种快速方法可以将按钮作为小部件添加到我的图形中,因此不需要 NavigationBar。我喜欢该栏提供的样式和功能,因此不必手动重新实现每一个。
谢谢。
NavigationToolbar
是正常的QWidget
。这意味着你可以用它做任何你也可以用其他小部件做的事情,包括
- 将其放入其他小部件的布局中
- 将其放入菜单
- 改变它的布局
- 将其绝对定位在 GUI 中
- 等...
这个问题有点太宽泛了,无法为所有这些问题提供解决方案;但也有足够的资源可用于如何在 PyQt 中操作和定位小部件。
下面是绝对定位 NavigationToolbar
的示例,它(默认情况下)是透明的。工具栏位于轴的原点,如果调整图形大小时将保留在那里。
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)
我正在尝试在带有嵌入式 matplotlib 图形的 Qt GUI 中最大限度地利用 space,包括标准的 matplotlib 导航栏以为用户提供有用的功能(缩放、保存、移动等)
不幸的是,当绘图 window 的比例为 'widescreen' 时,NavigationBar 最终占用了大量 space,如下所示。所有按钮都在左侧,但 NavigationBar 也创建了一整条白色 space。
虽然我的预期应用程序是在 Qt GUI 中嵌入 matplotlib 图,但我相信这是一个普遍问题,也适用于默认 matplotlib ax.plot 操作显示的标准图。
可以使用这个space吗?我尝试在这里设置文本和 mpl 小部件,但它们总是隐藏在导航栏后面。也许有一个设置可以使这个栏的颜色透明?
或者,是否有一种快速方法可以将按钮作为小部件添加到我的图形中,因此不需要 NavigationBar。我喜欢该栏提供的样式和功能,因此不必手动重新实现每一个。
谢谢。
NavigationToolbar
是正常的QWidget
。这意味着你可以用它做任何你也可以用其他小部件做的事情,包括
- 将其放入其他小部件的布局中
- 将其放入菜单
- 改变它的布局
- 将其绝对定位在 GUI 中
- 等...
这个问题有点太宽泛了,无法为所有这些问题提供解决方案;但也有足够的资源可用于如何在 PyQt 中操作和定位小部件。
下面是绝对定位 NavigationToolbar
的示例,它(默认情况下)是透明的。工具栏位于轴的原点,如果调整图形大小时将保留在那里。
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)