我想知道如何将使用 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()
由此我得到以下内容:
我想知道如何保存这些数据,因此,经过一些其他操作后,如果我用imshow
显示数据,我可以像原始图像那样恢复已映射和填充的轮廓颜色。 / p>
编辑:
即,我希望能够通过contourf
方法生成图像,对其进行一些操作,比如在特定区域中应用一些蒙版,然后绘制此修改后的数据。对于contour
的情况,我想使用这个图表来表示操作的一堆级别,而不是迭代cs.collection
并做一些事情(我真的不知道是什么)获得等效numpy.array
来代表这个情节。
我知道我可以将图像保存到文件而不是读取此文件,但这对我来说似乎是一个糟糕的解决方案。 我也尝试了that解决方案,但后来我得到了完整的情节,绿色区域等等,而不仅仅是真实的内容。
答案 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
部分进行后续时间。然后它取一个轮廓并移动它并将其重新创建为白线。
也就是说,这个图和修改后的轮廓完全是从重新加载的酸洗图中绘制出来的。
轮廓,是mpl Paths,并且可能比这个示例所暗示的更复杂,所以这种方法总是不能很好地工作(尽管它的通用版本考虑了其他路径数据 - - 请参阅上面链接的文档。
Pickling mpl项目有点新,没有完全记录或可靠,但是是一个有用的功能。
IPython Notebook :
另一方面,也许你真正想要的是像IPython笔记本!在那里,您的计算的整个历史记录是可用的,可查看的和可运行的。它不是存储数据,而是允许您轻松地重新访问,修改您之前所做的事情,等等。它非常强大。以下是一些链接和示例:A,B,C,D。