保存交互式Matplotlib数字

Mat*_*att 109 python matplotlib

有没有办法保存Matplotlib数字,以便可以重新打开并恢复典型的交互?(就像MATLAB中的.fig格式一样?)

我发现自己多次运行相同的脚本来生成这些交互式数字.或者我正在向我的同事发送多个静态PNG文件以显示情节的不同方面.我宁愿发送图形对象并让它们自己与它进行交互.

Dem*_*mis 50

我刚刚发现了如何做到这一点.@pelson提到的"实验泡菜支持"效果很好.

试试这个:

# Plot something
import matplotlib.pyplot as plt
fig,ax = plt.subplots()
ax.plot([1,2,3],[10,-10,30])
Run Code Online (Sandbox Code Playgroud)

交互式调整后,将图形对象保存为二进制文件:

import pickle
pickle.dump(fig, open('FigureObject.fig.pickle', 'wb')) # This is for Python 3 - py2 may need `file` instead of `open`
Run Code Online (Sandbox Code Playgroud)

稍后,打开图形,应该保存调整并且应该存在GUI交互:

import pickle
figx = pickle.load(open('FigureObject.fig.pickle', 'rb'))

figx.show() # Show the figure, edit it, etc.!
Run Code Online (Sandbox Code Playgroud)

您甚至可以从图中提取数据:

data = figx.axes[0].lines[0].get_data()
Run Code Online (Sandbox Code Playgroud)

(适用于线条,pcolor和imshow - pcolormesh可以通过一些技巧重建扁平数据.)

我从使用泡菜保存Matplotlib数字得到了很好的建议.

  • 你应该考虑关闭打开的文件:例如`with open('FigureObject.fig.pickle','rb')as file:figx = pickle.load(file)` (4认同)
  • 如果您不希望脚本继续运行并可能在“figx.show()”之后立即终止,则应该调用“plt.show()”,这是阻塞的。 (2认同)

pel*_*son 38

从Matplotlib 1.2开始,我们现在有实验性的泡菜支持.试一试,看看它是否适用于您的情况.如果您有任何问题,请通过Matplotlib邮件列表或在github.com/matplotlib/matplotlib上打开一个问题告诉我们.

  • 任何原因都可以将这个有用的功能添加到图中的"另存为"本身.或许添加.pkl? (2认同)

dr *_*bob 25

这将是一个很好的功能,但AFAIK它没有在Matplotlib中实现,并且由于存储数字的方式可能很难自己实现.

我建议(a)单独处理数据以生成图形(使用唯一名称保存数据)并编写图形生成脚本(加载保存数据的指定文件)并根据需要进行编辑或(b)保存为PDF/SVG/PostScript格式,并在Adobe Illustrator(或Inkscape)等奇特的图形编辑器中进行编辑.

编辑2012年秋季后:正如其他人在下面指出的那样(虽然这里提到这是接受的答案),自1.2版以来,Matplotlib已经允许你腌制数字.正如发行说明所述,它是一个实验性功能,不支持在一个matplotlib版本中保存图形并在另一个版本中打开.从不受信任的来源恢复泡菜通常也是不安全的.

对于共享/稍后编辑图(需要先进行重要的数据处理,可能需要在几个月之后调整,比如说在科学出版物的同行评审期间),我仍然建议工作流程(1)在生成绘图之前有一个数据处理脚本将处理后的数据(进入绘图)保存到文件中,(2)使用单独的绘图生成脚本(必要时进行调整)以重新创建绘图.这样,对于每个绘图,您可以快速运行脚本并重新生成它(并使用新数据快速复制绘图设置).也就是说,酸洗一个数字可以方便短期/互动/探索性数据分析.

  • `pickle`现在适用于MPL数字,所以这可以完成并且看起来效果很好 - 几乎就像一个Matlab".fig"图形文件.请参阅下面的答案(现在?),了解如何执行此操作的示例. (5认同)
  • 有点意外,这没有实现..但是好吧,我会将处理过的数据保存在一个中间文件中,并将其和一个脚本发送给同事.谢谢. (2认同)
  • 我怀疑实现很难,这就是为什么MATLAB的工作效果很差的原因.回到我使用它时,数字曾经崩溃MATLAB,甚至略有不同的版本都无法读取彼此.fig文件. (2认同)

pto*_*ato 7

为什么不直接发送Python脚本?MATLAB的.fig文件要求收件人让MATLAB显示它们,这相当于发送一个需要Matplotlib显示的Python脚本.

或者(免责声明:我还没试过这个),你可以尝试腌制这个数字:

import pickle
output = open('interactive figure.pickle', 'wb')
pickle.dump(gcf(), output)
output.close()
Run Code Online (Sandbox Code Playgroud)

  • 不幸的是,matplotlib数字不是pickleable,所以这种方法不起作用.在幕后,有太多的C扩展不支持酸洗.我完全同意发送脚本+数据,但是......我想我从来没有真正看到matlab保存的.fig的意思,所以我从未使用它们.根据我的经验,从长远来看,发送某人独立的代码和数据是最容易的.如果matplotlib的数字对象可以选择,那就太好了. (3认同)