Search code examples
pythonmatplotlibtiff

Save Matplotlib figure as TIFF


Does anyone know how to save a Matplotlib figure as *.tiff? It seems that this format is not supported in Python, while the journals are quite often ask for that format.

I am adding some minimal code:

# -*- 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)

This works:

fig.savefig('3dPlot.pdf')

But this does not:

fig.savefig('3dPlot.tif')

Solution

  • This is great! Thanks ot Martin Evans. However, for those who would like to make it happen in Python3.x, small fixes (since cStringIO module is not available; and I would rather use 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()