matplotlib数据的标签窗口是否可能?

时间:2016-05-20 12:32:56

标签: python matplotlib plot multipage tabbed

我有一个python项目,输出几个Matplotlib数字;每个图包含几个图表。项目每次运行启动大约15个数字(窗口)的问题,我无法减少。

是否可以将所有这些图形(窗口)连接到单个选项卡式窗口,以便每个选项卡代表一个图形?

非常感谢任何帮助。

提前致谢

解决方法

感谢下面的@mobiusklein评论,他提出了一个解决方法,将数据导出为myltipage pdf文件,如图所示here

重要提示 关于上述多页pdf示例

我试过了,但是我在matplotlib中使用LaTeX时遇到了错误。因为修复此错误超出了此问题的范围,所以我建议任何人都可以设置plt.rc('text', usetex=False)代替usetex=True

我仍然希望有人有其他解决方案或解决方法来发布它以造福他人。

6 个答案:

答案 0 :(得分:2)

您选择用于matplotlib的后端控制每个数字的显示方式。一些后端只是将数据呈现为文件,而其他后端则像tkqtgtk后端在图形窗口中呈现数字。这些后端确定了这些GUI窗口的功能。

现有的后端不支持您正在寻找的选项卡式导航类型。其他人here使用Qt4实现了这一点。

您也可以尝试使用PDF或HTML编写自己的报告文件,这样可以更轻松地使用更简单的库编写更复杂的图像排列。

答案 1 :(得分:2)

我为matplotlib写了一个简单的包装程序,该包装程序完成了您所描述的操作。您需要pyqt5才能运行。

这是代码,您构建一个plotWindow对象并将其提供给图形句柄。它将为每个图形创建一个新标签。


from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.backends.backend_qt5agg import NavigationToolbar2QT as NavigationToolbar
from PyQt5.QtWidgets import QMainWindow, QApplication, QWidget, QTabWidget, QVBoxLayout
import matplotlib.pyplot as plt
import sys

class plotWindow():
    def __init__(self, parent=None):
        self.app = QApplication(sys.argv)
        self.MainWindow = QMainWindow()
        self.MainWindow.__init__()
        self.MainWindow.setWindowTitle("plot window")
        self.canvases = []
        self.figure_handles = []
        self.toolbar_handles = []
        self.tab_handles = []
        self.current_window = -1
        self.tabs = QTabWidget()
        self.MainWindow.setCentralWidget(self.tabs)
        self.MainWindow.resize(1280, 900)
        self.MainWindow.show()

    def addPlot(self, title, figure):
        new_tab = QWidget()
        layout = QVBoxLayout()
        new_tab.setLayout(layout)

        figure.subplots_adjust(left=0.05, right=0.99, bottom=0.05, top=0.91, wspace=0.2, hspace=0.2)
        new_canvas = FigureCanvas(figure)
        new_toolbar = NavigationToolbar(new_canvas, new_tab)

        layout.addWidget(new_canvas)
        layout.addWidget(new_toolbar)
        self.tabs.addTab(new_tab, title)

        self.toolbar_handles.append(new_toolbar)
        self.canvases.append(new_canvas)
        self.figure_handles.append(figure)
        self.tab_handles.append(new_tab)

    def show(self):
        self.app.exec_()

if __name__ == '__main__':
    import numpy as np

    pw = plotWindow()

    x = np.arange(0, 10, 0.001)

    f = plt.figure()
    ysin = np.sin(x)
    plt.plot(x, ysin, '--')
    pw.addPlot("sin", f)

    f = plt.figure()
    ycos = np.cos(x)
    plt.plot(x, ycos, '--')
    pw.addPlot("cos", f)
    pw.show()

这也发布在:https://github.com/superjax/plotWindow

希望这对您的应用程序是一个很好的起点。

答案 2 :(得分:1)

可以使用小部件实现功能相似的东西。例如,提供一行按钮,每个按钮按一个按钮",并重新绘制窗口的图形部分以响应每个按钮。

答案 3 :(得分:1)

按钮示例作为变通方法具有创造性。如另一说明,您可以使用PyQt创建选项卡式窗口。

因此我使用PyQtGraph。 PyQtGraph只使用PyQt作为后端,因此本地"支持标签式窗口和#34; docks"。码头允许可移动的标签和拆分,以及断开标签或拆分到新的浮动窗口。

一般来说,PyQtGraph的底座提供了一种组织你的图形/图表/图像的方法,这些方法是我无法通过其他图书馆获得的。

Bokeh提供标签式窗口through their Panels and Tabs widgets

我知道离开matplotlib并不总是可行,但我觉得缺乏代表性的库已经考虑并实现了专门针对您的用例的工具。

答案 4 :(得分:1)

我分享了我的代码,该代码允许通过拖放操作(qt停靠系统)进行停靠和制表。它充当matplotlib后端,因此易于集成。

https://github.com/peper0/mpldock

答案 5 :(得分:0)

我最近发布了一个 python 包,其中包含一个名为 DockablePlotWindow 的类,它提供了一个类似于 superjax 的答案的解决方案,但它提供了更多的灵活性来组织绘图最初的显示方式。

我有兴趣继续改进这个包,所以请随时在 github 上打开拉取请求或问题。您可以在此处找到相关信息:https://github.com/nanthony21/mpl_qt_viz 和这里: https://nanthony21.github.io/mpl_qt_viz/