【问题标题】:How to extract data from matplotlib plot如何从 matplotlib 图中提取数据
【发布时间】:2012-02-14 20:14:58
【问题描述】:

我有一个wxPython 程序,它从不同的数据集读取数据,对数据执行各种类型的简单动态分析,并将数据集的各种组合绘制到matplotlib 画布上。我希望有机会将当前绘制的数据转储到文件中,以便以后进行更复杂的分析。

问题是:matplotlib 中是否有任何方法允许访问当前在matplotlib.Figure 中绘制的数据?

【问题讨论】:

    标签: python matplotlib


    【解决方案1】:

    Jakub 修改 Python 脚本以将数据直接从发送到绘图的源中写出是正确的;这就是我更喜欢这样做的方式。但作为参考,如果您确实需要从绘图中获取数据,我认为应该这样做

    gca().get_lines()[n].get_xydata()
    

    或者,您可以分别获取 x 和 y 数据集:

    line = gca().get_lines()[n]
    xd = line.get_xdata()
    yd = line.get_ydata()
    

    【讨论】:

    • 谢谢,我认为应该这样做。如果您想知道为什么我更喜欢将数据从绘图中转储而不是弄乱数据源,请参阅我对@Jacub 的评论。
    • 为什么mpl_toolkits.mplot3d.art3d.Line3D object 没有get_zdata()?我无法提取 z 值。 :-(
    • @SibbsGambling 你必须与 matplotlib 的开发者交流。
    【解决方案2】:

    matplotlib.pyplot.gca 可用于从 matplotlib 图中提取数据。这是一个简单的例子:

    import matplotlib.pyplot as plt
    plt.plot([1,2,3],[4,5,6])
    ax = plt.gca()
    line = ax.lines[0]
    line.get_xydata()
    

    运行此程序时,您将看到 2 个输出 - 绘图和数据:

    array([[1., 4.],
       [2., 5.],
       [3., 6.]])
    

    您也可以分别获取 x 数据和 y 数据。 运行line.get_xdata(),你会得到:

    array([1, 2, 3])
    

    在运行line.get_ydata() 时,您将获得:

    array([4, 5, 6])
    

    注意: gca 代表获取当前坐标轴

    【讨论】:

      【解决方案3】:

      它是 Python,因此您可以直接修改源脚本,以便在绘制数据之前转储数据

      【讨论】:

      • 我知道这是最 Pythonic 的方式 :) 但首先,数据从许多地方发送到绘图并在绘图时进行修改;我需要跟踪绘制数据的每一次修改。其次 - 我不需要每次都转储数据。我想先找到一些有趣的东西,然后按 NavigationToolbar 上的按钮将其导出到文件。 NavigationToolbar 链接到 FigureCanvas,因此按钮可以无缝访问 Figure 属性和方法。这就是为什么我问如何从情节中转储数据。
      • 这只有在用户事先知道他们想要导出数据并且数据是静态的时才有效。我会说很少见。
      【解决方案4】:

      我知道这是一个老问题,但我觉得有一个比这里提供的更好的解决方案,所以我决定写这个答案。

      您可以使用unittest.mock.patch临时替换matplotlib.axes.Axes.plot函数:

      from unittest.mock import patch
      
      def save_data(self, *args, **kwargs):
          # save the data that was passed into the plot function
          print(args)
      
      with patch('matplotlib.axes.Axes.plot', new=save_data):
          # some code that will eventually plot data
          a_function_that_plots()
      

      退出with 块后,Axes.plot 将恢复正常行为。

      【讨论】:

      • 太棒了,太棒了!应该是 2021 年公认的答案
      • 如何在不写入文件的情况下将数据放入内存? with 杀死它。 global? :\
      【解决方案5】:

      总结一下,供以后参考:

      如果使用 plt.plot()plt.stem()plt.step() 进行绘图,您可以获得 Line2D 对象的列表:

      ax = plt.gca() # to get the axis
      ax.get_lines()
      

      对于plt.pie()plt.bar()plt.barh(),您可以获得楔形或矩形对象列表:

      ax = plt.gca() # to get the axis
      ax.patches()
      

      然后,根据具体情况,您可以通过运行get_xdata()get_ydata()(请参阅Line2D)获取更多信息。

      或即get_height() 用于条形图(请参阅Rectangle)了解更多信息。

      一般来说,对于所有基本绘图功能,您可以通过运行 ax.get_children() 找到您要查找的内容

      返回子Artists 的列表(基类包含图形的所有元素)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-12-03
        • 2011-08-05
        • 2016-11-15
        • 1970-01-01
        • 2019-06-25
        相关资源
        最近更新 更多