Python Matplotlib:如何自动保存图形为.fig格式?

10

使用Python的matplotlib模块,可以使用pylab.savefig()函数保存图形。然而,该函数似乎不能用于将图形保存为.fig格式。.fig格式是matlab图形格式。

.fig格式可以调整/修改图形,这就是我想要将图形保存为.fig格式的原因。

那么,有没有办法使用Python的matplotlib保存图形为.fig格式呢?


1
@Schorsch 在将图形保存为 .png 格式后,我无法像修改 .fig 文件那样修改 .png 文件。 - lily
1
@Bill 举个例子,我最初是为一篇论文绘制了这张图表。但后来我发现需要将其放在 PTT 中,因此需要调整宽高比或标题,或者添加一些虚线作为基准线等等。这只是一个例子。 - lily
5
matplotlib没有轻松的方法来做到这一点。处理这个问题的首选方法是编写一个Python脚本/函数,输入您的(原始?)数据并返回图形。然后,您可以在需要时进行微调和重新生成图形。 - tacaswell
1
Matplotlib有一个(实验性的?)功能,允许您pickle对象。这将允许您保存一个对象,然后在以后的日期在Python中打开进行修改。 - Ffisegydd
1
您可以将图形保存为SVG文件。稍后,您可以在任何矢量图形程序中对其进行修改。 - numentar
显示剩余4条评论
4个回答

7

您可以像这样将图形pickle到磁盘上

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

# Plot
fig_object = plt.figure()
x = np.linspace(0,3*np.pi)
y = np.sin(x)
plt.plot(x,y)
# Save to disk
pickle.dump(fig_object,open('sinus.pickle','wb'))

然后从磁盘上加载并显示:

fig_object = pickle.load(open('sinus.pickle','rb'))
fig_object.show()

5
MATLAB的.fig文件 不仅仅是MAT文件,它包含了图形句柄对象中的每个对象及其所有属性。MATLAB的句柄对象是类对象,其类型决定要绘制的图形,其属性决定如何绘制它。
例如,线性图将具有一个图形对象,其中包含一个轴对象,其中包含一个线对象。线对象将具有包含所绘数据的xdata和ydata属性。但是,这些对象都有许多属性需要设置。例如,该线还具有颜色和宽度的属性,使用哪些标记以及如何绘制这些标记等属性。
我们可以使用scipy.io.savemat在Python中编写MAT文件。但生成要保存的数据将是很多工作。我们必须获取我们希望保存的图形中的每个Matplotlib对象(它们与MATLAB具有类似的层次结构),并将它们的属性转换为MATLAB在其对象中表示它们的方式。这将涉及到每种图形对象类型的研究,因为它们都有不同的属性集。
从Matplotlib绘图中创建.fig文件的函数是可以实现的,但在我看来不值得这样做。更容易的方法是保存数据并将生成绘图的Python脚本转换为MATLAB脚本,以在MATLAB中生成相应的绘图。

1
如果您想将Python图表保存为交互式图以便修改并与其他人共享,就像MATLAB .fig文件一样,则可以尝试以下代码。这里的z_data.values只是一个numpy ndarray,因此您可以使用相同的代码来绘制和保存自己的数据,无需使用pandas。
生成的文件可以被任何人打开并进行交互式修改,无论是否具有Python知识,只需单击它并在Chrome / Firefox / Edge等浏览器中打开即可。
import plotly.graph_objects as go
import pandas as pd

z_data=pd.read_csv('https://raw.githubusercontent.com/plotly/datasets/master/api_docs/mt_bruno_elevation.csv')

fig = go.Figure(data=[go.Surface(z=z_data.values)])

fig.update_layout(title='Mt Bruno Elevation', autosize=False,
                  width=500, height=500,
                  margin=dict(l=65, r=50, b=65, t=90))

fig.show()
fig.write_html("testfile.html")

0

我从未找到一种使用.fig格式输出图形的方法,但有一个替代方案是将您的绘图作为encapsulated post-scripts (eps)输出。这样可以在事后使用像Adobe Illustrator这样的程序对各个绘图元素进行操作。

import matplotlib.pyplot as plt
.
.
.
plt.savefig("MyFigure.eps", format="eps")

你现在两年后找到方法了吗? - Charlie Parker
说实话我还没有尝试过,但eps已经完全满足我的需求了。像Gimp这样的免费工具可以进行任何必要的修改。对于任何3D可视化,我通常会轻松地制作一个旋转动画gif,就像这样:https://stackoverflow.com/questions/26876885/how-to-make-gif-images-from-a-set-of-images-in-matlab - Raab70

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接