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

时间:2014-10-07 18:11:36

标签: python arrays numpy matplotlib

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

例如,假设我使用以下code生成了等值线图:

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

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)
# difference of Gaussians
Z = 10.0 * (Z2 - Z1)

plt.figure()
CS = plt.contour(X, Y, Z)
plt.show()

由此我得到以下内容:

enter image description here

我想知道如何保存这些数据,因此,经过一些其他操作后,如果我用imshow显示数据,我可以像原始图像那样恢复已映射和填充的轮廓颜色。 / p>

编辑:

即,我希望能够通过contourf方法生成图像,对其进行一些操作,比如在特定区域中应用一些蒙版,然后绘制此修改后的数据。对于contour的情况,我想使用这个图表来表示操作的一堆级别,而不是迭代cs.collection并做一些事情(我真的不知道是什么)获得等效numpy.array来代表这个情节。

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

1 个答案:

答案 0 :(得分:3)

对于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子句选择等高线图,然后使用else部分进行后续时间。然后它取一个轮廓并移动它并将其重新创建为白线。

也就是说,这个图和修改后的轮廓完全是从重新加载的酸洗图中绘制出来的。

enter image description here

轮廓,是mpl Paths,并且可能比这个示例所暗示的更复杂,所以这种方法总是不能很好地工作(尽管它的通用版本考虑了其他路径数据 - - 请参阅上面链接的文档。

Pickling mpl项目有点新,没有完全记录或可靠,但是是一个有用的功能。

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