2016-06-21 3 views
4

Кто-нибудь знает, как сохранить фигуру matplotlib как * .tiff? Похоже, что этот формат не поддерживается в Python, в то время как журналы довольно часто запрашивают этот формат.Python matplotlib сохранить как TIFF

Я добавляю некоторый минимальный код:

# -*- 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') 
+0

журналы действительно нужны размолвки генерируемых изображений ли? Я думал, что tiffs используются только для вещей, таких как фотографии или, может быть, художественные образы. – syntonym

+0

Возможный дубликат [Сохранить исходные данные как tif] (http://stackoverflow.com/questions/19673619/save-raw-data-as-tif) – Deadpool

+0

К сожалению, они запрашивают tiff-s. Я знаю, что это странно. Кроме того, я не работал с ним. – striatum

ответ

2

Это замечательно! Спасибо ot 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() 
5

В качестве временного решения, то не было бы ничего, чтобы остановить вы используете 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 cStringIO 


# 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 = cStringIO.StringIO() 
fig.savefig(png1, format="png") 

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

# Save as TIFF 
png2.save("3dPlot.tiff") 
png1.close() 
Смежные вопросы