NavigationToolbar
是正常的QWidget
。这意味着您可以用它做所有您也可以用其他小部件做的事情,包括
- 将其放入其他小部件的布局中
- 将其放入菜单
- 改变它的布局
- 将其绝对定位在 GUI 内
- ETC...
这个问题有点过于宽泛,无法为所有这些提供解决方案;但是对于如何在 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)