将 Matplotlib 图另存为 TIFF

Posted

技术标签:

【中文标题】将 Matplotlib 图另存为 TIFF【英文标题】:Save Matplotlib figure as TIFF 【发布时间】:2016-06-21 13:13:56 【问题描述】:

有谁知道如何将 Matplotlib 图形保存为 *.tiff? Python似乎不支持这种格式,而期刊经常要求这种格式。

我正在添加一些最少的代码:

# -*- coding: utf-8 -*-

from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
import numpy as np

# fig setup
fig = plt.figure(figsize=(5,5), dpi=300)
ax = fig.gca(projection='3d')
ax.set_xlim([-1,1])
ax.set_ylim([-1,1])
ax.set_zlim([-1,1])
ax.axes.xaxis.set_ticklabels([])
ax.axes.yaxis.set_ticklabels([])
ax.axes.zaxis.set_ticklabels([])

# draw a surface
xx, yy = np.meshgrid(range(-1,2), range(-1,2))
zz = np.zeros(shape=(3,3))
ax.plot_surface(xx, yy, zz, color='#c8c8c8', alpha=0.3)
ax.plot_surface(xx, zz, yy, color='#b6b6ff', alpha=0.2)

# draw a point
ax.scatter([0],[0],[0], color='b', s=200)

这行得通:

fig.savefig('3dPlot.pdf')

但这不是:

fig.savefig('3dPlot.tif')

【问题讨论】:

Save raw data as tif的可能重复 不幸的是,他们确实要求 tiff-s。我知道这很奇怪。另外,我没有使用它。 如果您不需要精确的色彩再现,您可以简单地保存为 png 并将 png 文件转换为 tiff。我以前做过。 我不认为这是重复的。并非每个情节都是原始图像。例如,如果我们从一个简单的plot(x, y) 开始,则完全不清楚如何使用 PIL/Pillow 将其保存为 tif 【参考方案1】:

作为一种解决方法,没有什么可以阻止您使用 Python PIL 包将图像保存为 TIFF 格式:

# -*- coding: utf-8 -*-

from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
import numpy as np

from PIL import Image
import io

# fig setup
fig = plt.figure(figsize=(5,5), dpi=300)
ax = fig.gca(projection='3d')
ax.set_xlim([-1,1])
ax.set_ylim([-1,1])
ax.set_zlim([-1,1])
ax.axes.xaxis.set_ticklabels([])
ax.axes.yaxis.set_ticklabels([])
ax.axes.zaxis.set_ticklabels([])

# draw a surface
xx, yy = np.meshgrid(range(-1,2), range(-1,2))
zz = np.zeros(shape=(3,3))
ax.plot_surface(xx, yy, zz, color='#c8c8c8', alpha=0.3)
ax.plot_surface(xx, zz, yy, color='#b6b6ff', alpha=0.2)

# draw a point
ax.scatter([0],[0],[0], color='b', s=200)

#fig.savefig('3dPlot.pdf')

# Save the image in memory in PNG format
png1 = io.BytesIO()
fig.savefig(png1, format="png")

# Load this image into PIL
png2 = Image.open(png1)

# Save as TIFF
png2.save("3dPlot.tiff")
png1.close()

如果使用的是 Python 2.x,请使用 cStringIO 而不是 BytesIO,如下所示:

import cStringIO

# Replace the BytesIO() call with
png1 = cStringIO.StringIO()

【讨论】:

【参考方案2】:

这太棒了!谢谢Martin Evans。 但是,对于那些想在Python3.x 中实现它的人,小修复(因为cStringIO 模块不可用;我宁愿使用BytesIO

# -*- coding: utf-8 -*-

from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
import numpy as np

from PIL import Image
from io import BytesIO

# fig setup
fig = plt.figure(figsize=(5,5), dpi=300)
ax = fig.gca(projection='3d')
ax.set_xlim([-1,1])
ax.set_ylim([-1,1])
ax.set_zlim([-1,1])
ax.axes.xaxis.set_ticklabels([])
ax.axes.yaxis.set_ticklabels([])
ax.axes.zaxis.set_ticklabels([])

# draw a point
ax.scatter([0],[0],[0], color='b', s=200)

# save figure
# (1) save the image in memory in PNG format
png1 = BytesIO()
fig.savefig(png1, format='png')

# (2) load this image into PIL
png2 = Image.open(png1)

# (3) save as TIFF
png2.save('3dPlot.tiff')
png1.close()

【讨论】:

如果我需要将条形图保存为 tiff 图像怎么办?我应该为“fig”分配什么?【参考方案3】:

Matplotlib does support tif since version 1.1 但支持是可选的,并不明显。只要您安装了pillow,就可以像保存到任何其他格式一样保存到 tif。因此,您的示例将是:

# -*- coding: utf-8 -*-

from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
import numpy as np
import PIL # not necessary but mustn't fail

# fig setup
fig = plt.figure(figsize=(5,5), dpi=300)
ax = fig.gca(projection='3d')
ax.set_xlim([-1,1])
ax.set_ylim([-1,1])
ax.set_zlim([-1,1])
ax.axes.xaxis.set_ticklabels([])
ax.axes.yaxis.set_ticklabels([])
ax.axes.zaxis.set_ticklabels([])

# draw a surface
xx, yy = np.meshgrid(range(-1,2), range(-1,2))
zz = np.zeros(shape=(3,3))
ax.plot_surface(xx, yy, zz, color='#c8c8c8', alpha=0.3)
ax.plot_surface(xx, zz, yy, color='#b6b6ff', alpha=0.2)

# draw a point
ax.scatter([0],[0],[0], color='b', s=200)

fig.savefig('3dPlot.tif')

【讨论】:

【参考方案4】:

您所要做的就是安装 Pillow 。 然后你可以使用这个:

fig.savefig('3dPlot.tiff')

【讨论】:

这是迄今为止从 matplotlib(和 Pillow)实现 TIFF 输出的最简单途径。

以上是关于将 Matplotlib 图另存为 TIFF的主要内容,如果未能解决你的问题,请参考以下文章

在 MATLAB 中将频谱图另存为图像

将谷歌图表另存为 pdf

Graphviz,gvpr 无法识别

使用 VBA 将表单另存为报表

JavaScript 将元素另存为图像或 Extjs 4.x 另存为图像

如何保存不另存为