Python 将数据从绘图保存到numpy数组

Python 将数据从绘图保存到numpy数组,python,arrays,numpy,matplotlib,Python,Arrays,Numpy,Matplotlib,我想知道如何将使用Matplotlib生成的绘图的数据内容保存到Numpy数组中 例如,假设我生成了一个等高线图,其中包含以下内容: 从中我得到以下信息: 我想知道如何保存这些数据,以便在进行一些其他操作后,例如,如果我使用imshow显示数据,我可以恢复像原始图像一样映射和填充的轮廓颜色 编辑: 也就是说,我希望能够获得由contourf方法生成的图像,对其进行一些操作,比如在特定区域应用一些遮罩,然后绘制修改后的数据。对于contour的情况,我想用这个图来表示一组级别来进行操作,而不是迭

我想知道如何将使用Matplotlib生成的绘图的数据内容保存到Numpy数组中

例如,假设我生成了一个等高线图,其中包含以下内容:

从中我得到以下信息:

我想知道如何保存这些数据,以便在进行一些其他操作后,例如,如果我使用
imshow
显示数据,我可以恢复像原始图像一样映射和填充的轮廓颜色

编辑:

也就是说,我希望能够获得由
contourf
方法生成的图像,对其进行一些操作,比如在特定区域应用一些遮罩,然后绘制修改后的数据。对于
contour
的情况,我想用这个图来表示一组级别来进行操作,而不是迭代
cs.collection
,然后做一些事情(我真的不知道是什么)来获得一个等价的
numpy.array
来表示这个图

我知道我可以将图像保存到文件中,而不是读取此文件,但这似乎是一个糟糕的解决方案。
我也尝试了解决方案,但随后我得到了完整的绘图,带有绿色区域等等,而不仅仅是真实的内容。

对于matplotlib的最新版本,您可以使用
pickle
保存整个绘图或仅选定的部分,甚至可以从pickle数据中再次显示绘图:

import numpy as np
import matplotlib.mlab as mlab
import matplotlib.pyplot as plt
import pickle

if 0:  # to generate the file
    delta = 0.025
    x = np.arange(-3.0, 3.0, delta)
    y = np.arange(-2.0, 2.0, delta)
    X, Y = np.meshgrid(x, y)
    Z1 = mlab.bivariate_normal(X, Y, 1.0, 1.0, 0.0, 0.0)
    Z2 = mlab.bivariate_normal(X, Y, 1.5, 0.5, 1, 1)
    Z = 10.0 * (Z2 - Z1)

    ax = plt.subplot(111)
    CS = ax.contourf(X, Y, Z)

    pickle.dump(ax, open("mpl_test.pkl", "w"))
    pickle.dump(CS, open("contours.pkl", "w"))

else: # Then at a later time...

    x0 = pickle.load(open("mpl_test.pkl", "r"))
    x1 = pickle.load(open("contours.pkl", "r"))

    v = x1.collections[0].get_paths()[0].vertices   # get the vertices of the contour
    x, y = v[:,0]+.2, v[:,1]+.1                     # shift the contour
    x0.plot(x, y, 'w', linewidth=3)                 # add it to the plot as a white line
上面的示例首先使用
if
子句对等高线图进行pickle处理,然后再使用
else
部分。然后,它取一个轮廓,移动它,并将其重新绘制为一条白线

也就是说,此图形和修改后的轮廓完全从重新加载的酸洗图形绘制

等高线,是,并且可能比这个例子所暗示的更复杂,所以这个方法并不总是很好地工作(尽管它的一个广义版本考虑了其他路径数据——参见上面链接的文档)

酸洗mpl项目有点新,没有完整的文档记录或可靠性,但它是一个有用的功能

IPython笔记本电脑

另一方面,也许你真正想要的是像IPython笔记本一样的东西!在那里,计算的整个历史都是可用的、可查看的和可运行的。它不需要存储数据,而是允许您轻松地重新访问、修改以前的操作等等。它非常强大。下面是一些链接和示例:,。

Awesome方法。然而,我想开放地做的是访问数据并进行一些计算,比如在其上应用遮罩,然后绘制结果。这不允许我这么做,对吧?这是一个很棒的功能。我认为这样想的方式是,你可以得到(并可能修改)关于如何绘制情节的每一个细节,但没有任何关于是什么让你做到这一点的。例如,定义轮廓的曲线是mpl路径(),您可以获取它们的顶点等,但它们是矢量绘制曲线,而不仅仅是x、y对的numpy数组。我添加了一个示例来说明。正如我在这里所说的,这可能会使它看起来比一般问题更简单。关于上述可靠性的一个小附加组件文档告诉我们,pickle“在还原保存在另一个matplotlib版本中的pickle时不受支持,在从不受信任的源还原pickle时不安全”是的,事实上,我想要的是恢复一些绘制的数据数组(但不是我的原始数据,通过一些绘制方法获得的数据,如等高线)。但我明白这是没有提供的。我很难理解你到底想要什么,即使是从你09/10/14的编辑。请给出一个具体的例子(python代码),说明在保存fig和数据之前,您希望对其执行什么操作,然后也许可以找出如何保存它,以便在重新加载的图中执行相同的操作。
import numpy as np
import matplotlib.mlab as mlab
import matplotlib.pyplot as plt
import pickle

if 0:  # to generate the file
    delta = 0.025
    x = np.arange(-3.0, 3.0, delta)
    y = np.arange(-2.0, 2.0, delta)
    X, Y = np.meshgrid(x, y)
    Z1 = mlab.bivariate_normal(X, Y, 1.0, 1.0, 0.0, 0.0)
    Z2 = mlab.bivariate_normal(X, Y, 1.5, 0.5, 1, 1)
    Z = 10.0 * (Z2 - Z1)

    ax = plt.subplot(111)
    CS = ax.contourf(X, Y, Z)

    pickle.dump(ax, open("mpl_test.pkl", "w"))
    pickle.dump(CS, open("contours.pkl", "w"))

else: # Then at a later time...

    x0 = pickle.load(open("mpl_test.pkl", "r"))
    x1 = pickle.load(open("contours.pkl", "r"))

    v = x1.collections[0].get_paths()[0].vertices   # get the vertices of the contour
    x, y = v[:,0]+.2, v[:,1]+.1                     # shift the contour
    x0.plot(x, y, 'w', linewidth=3)                 # add it to the plot as a white line