保存交互式Matplotlib图形
有没有办法保存一个Matplotlib图形,这样它可以重新打开,并且恢复一些常见的交互功能?(就像MATLAB中的.fig格式一样?)
我发现自己经常运行同样的脚本来生成这些可以互动的图形。或者我给同事发送多个静态的PNG文件,以展示图表的不同方面。我更希望能发送图形对象,让他们自己进行互动。
6 个回答
为什么不直接发送Python脚本呢?MATLAB的.fig文件需要接收者有MATLAB才能显示,所以这就相当于发送一个需要Matplotlib才能显示的Python脚本。
另外(声明一下:我还没试过这个),你可以尝试把图形进行“腌制”(pickling):
import pickle
output = open('interactive figure.pickle', 'wb')
pickle.dump(gcf(), output)
output.close()
我刚刚发现了怎么做。@pelson提到的“实验性pickle支持”效果很好。
试试这个:
# Plot something
import matplotlib.pyplot as plt
fig,ax = plt.subplots()
ax.plot([1,2,3],[10,-10,30])
在你进行交互式调整后,把图形对象保存为一个二进制文件:
import pickle
pickle.dump(fig, open('FigureObject.fig.pickle', 'wb')) # This is for Python 3 - py2 may need `file` instead of `open`
之后,打开这个图形,之前的调整应该会被保存,并且可以继续进行图形界面的交互:
import pickle
figx = pickle.load(open('FigureObject.fig.pickle', 'rb'))
figx.show() # Show the figure, edit it, etc.!
你甚至可以从图中提取数据:
data = figx.axes[0].lines[0].get_data()
(这适用于线条、pcolor和imshow - pcolormesh需要一些技巧来重建扁平化的数据。)
我从使用Pickle保存Matplotlib图形得到了这个很棒的建议。
从1.2版本开始,Matplotlib允许你将图形进行“序列化”,也就是把图形保存成一种可以存储和传输的格式。不过,正如发布说明中提到的,这个功能还在实验阶段,不能保证在一个版本中保存的图形可以在另一个版本中打开。而且,从不可信的来源恢复序列化的文件通常也不安全。
如果你想分享或者以后再编辑那些需要大量数据处理的图表(比如说,几个月后在同行评审时需要调整的科学出版物),我还是建议你采用这样的工作流程:第一,写一个数据处理脚本,在生成图表之前先把处理好的数据保存到一个文件里;第二,写一个单独的图表生成脚本(根据需要进行调整)来重新创建图表。这样,你可以快速运行脚本,重新生成每个图表(并快速用新数据复制你的图表设置)。不过,序列化图形在短期、互动或探索性的数据分析中可能会很方便。
如果你使用的是一个非常旧的版本,没有这个功能,我建议你可以选择(a)把数据处理和图形生成分开(保存数据时用一个独特的名字),然后写一个图形生成脚本(加载指定的保存数据文件),根据需要进行编辑;或者(b)将图形保存为PDF、SVG或PostScript格式,然后在一些高级图形编辑器中编辑,比如Adobe Illustrator(或者Inkscape)。