gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 03:12:10 24 4
gpt4 key购买 nike

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

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

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

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

或者,是否有一种快速的方法可以将按钮作为小部件添加到我的图形中,因此不需要 NavigationBar。我喜欢该栏提供的样式和功能,因此不必手动重新实现每一个。

谢谢。

最佳答案

NavigationToolbar 是一个普通的QWidget。这意味着您可以用它做任何您也可以用其他小部件做的事情,包括

  • 将其放入其他小部件的布局中
  • 将其放入菜单
  • 改变它的布局
  • 将其绝对定位在 GUI 中
  • 等...

这个问题有点过于宽泛,无法为所有这些问题提供解决方案;但也有足够的资源可用于如何在 PyQt 中操作和定位小部件。

下面是绝对定位的 NavigationToolbar 的示例,它(默认情况下)是透明的。工具栏位于轴的原点,如果调整图形大小时将保留在那里。

GUI with tranparent navigation toolbar

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 - Matplotlib 中的透明导航栏(或者,可以在没有栏的情况下添加导航按钮吗?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44251040/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com