【问题标题】:python matplotlib: how to automatically save figures in .fig format?python matplotlib:如何以 .fig 格式自动保存数字?
【发布时间】:2021-06-28 22:01:08
【问题描述】:

使用 python matplotlib 模块,我们可以使用 pylab.savefig() 函数来保存图形。 但是,似乎此功能不能用于将数字保存为 .fig 格式。 .fig格式为matlab图形格式。

使用 .fig 格式,我们可以调整/修改图形,这就是为什么我想将图形保存为 .fig 格式。

那么有什么方法可以使用 python matplotlib 将图形保存为 .fig 格式?

【问题讨论】:

  • @Schorsch 将数字保存为 .png 格式后,我无法像修改 .fig 文件一样修改 .png 文件
  • @lily 我相信 Schorsch 是在问为什么您需要对 matlab 中使用 matplotlib 生成的图形进行修改;为什么不在生成图形之前直接在 python 中进行这些修改? 听起来真正的问题是你不知道如何在 matplotlib 中做一些你可以在 matlab 中做的事情。 那是什么?
  • @Bill 例如,最初,我为一篇论文绘制图表。但后来我注意到我需要把它放在 PTT 中,因此需要调整宽度:长度比率或标题,或者我需要添加一些虚线作为基准,blabla。只是一个例子
  • matplotlib 没有简单的方法来做到这一点。处理这个问题的首选方法是编写一个 python 脚本/函数,它接收你的(原始?)数据并返回图形。然后,您可以在需要时调整并重新生成图表。
  • Matplotlib 有一个(实验性的?)功能,可以让你pickle 对象。这将允许您保存一个对象,然后可以在以后在 Python 中打开以进行修改。

标签: python matlab matplotlib figure


【解决方案1】:

您可以像这样将图形腌制到磁盘

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()

【讨论】:

    【解决方案2】:

    MATLAB .fig 文件is nothing more than a MAT-file 包含图中的每个句柄图形对象,以及它们的所有属性。 MATLAB 句柄图形对象是类对象,其类型决定要绘制什么图形,其属性决定如何绘制。

    例如,线图将有一个图形对象,其中包含一个轴对象,其中包含一个线对象。线对象将具有包含绘制数据的xdataydata 属性。但是这些对象中的每一个都有很多很多需要设置的属性。例如,线条还具有颜色和宽度、使用哪些标记以及如何绘制这些属性等。

    我们可以使用scipy.io.savemat 在 Python 中编写一个 MAT 文件。但是生成要保存的数据将是很多工作。我们必须获取我们希望保存的图中的每个 Matplotlib 对象(与 MATLAB 具有相似的层次结构),并将它们的属性转换为 MATLAB 在对象中表示它们的方式。这将涉及对每种图形对象类型的研究,因为它们都有一组不同的属性。

    编写一个函数来从 Matplotlib 图创建一个 .fig 文件是可能的,但不值得付出努力,IMO。保存数据并将生成绘图的 Python 脚本转换为 MATLAB 脚本以在 MATLAB 中生成等效绘图会更容易。

    【讨论】:

      【解决方案3】:

      如果您希望将 python 绘图保存为交互式图形以修改并与其他人共享,例如 MATLAB .fig 文件,那么您可以尝试以下代码。这里z_data.values 只是一个 numpy ndarray,因此您可以使用相同的代码来绘制和保存您自己的数据。那就不用熊猫了。

      这里生成的文件可以被任何有或没有 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")
      

      【讨论】:

        【解决方案4】:

        我从未找到使用 .fig 格式输出图形的方法,但另一种方法是将绘图输出为封装后的脚本 (eps)。这允许在事后使用 adobe illustrator 等程序对各个绘图元素进行操作。

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

        【讨论】:

        • 两年后你现在找到方法了吗?
        • 还没有真正尝试过 TBH,eps 可以很好地满足我的需求。 Gimp 等免费工具允许进行任何必要的修改。对于任何 3D 可视化,我通常会像这样轻松制作动画旋转 gif:stackoverflow.com/questions/26876885/…
        猜你喜欢
        • 2021-10-06
        • 2014-10-03
        • 2014-04-29
        • 2020-03-21
        • 1970-01-01
        • 2018-02-28
        • 2019-04-11
        • 2023-03-29
        • 1970-01-01
        相关资源
        最近更新 更多