2011-05-16 22 views
17

Tengo algunas representaciones de color que necesito guardar en escala de grises. ¿Hay una forma fácil de hacerlo sin cambiar los formatos de trazado?Guardar diagrama de matplotlib en escala de grises

+4

Hubo algunas discusiones al respecto, vea [convertir la cifra de color a BW/escala de grises] (http://old.nabble.com /convert-figure-from-color-to-BW-grayscale-td29756144.html). No sé si el atributo 'set_gray' está disponible o no en la última versión de matplotlib. – chl

+0

Podría usar imagemagick después: 'convert -type Grayscale old.png new.png' Creo que ya hay algo en SO cf [link] (http://stackoverflow.com/questions/3823752/display-image-as- escala de grises-usando-matplotlib) –

Respuesta

4

En realidad, esto se preguntó antes. Aquí es una respuesta bastante buena, que viene segundo en Google (a partir de hoy):
Display image as grayscale using matplotlib

Y la solución es muy similar al de Suki ...

Oh, bueno, estoy aburrido, así que publicar aquí también un código completo soplado:

import numpy as np 
import pylab as p 
xv=np.ones(4)*.5 
yv=np.arange(0,4,1) 
xv1=np.ones(4)*-.5 
yv1=np.arange(0,4,1) 

#red vertical line on the right 
yv2=np.arange(0,1.5,0.1) 
xv2=np.ones_like(yv2)*.7 

#red vertical line on the left 
yv3=np.arange(0,2,0.01) 
xv3=np.ones_like(yv3)*-0.7 

### 
xc=np.arange(-1.4,2,0.05) 
yc=np.ones_like(xc)*1 

fig = p.figure() 
ax1 = fig.add_subplot(111) 
#adjustprops = dict(left=0.12, bottom=0.2, right=0.965, top=0.96, wspace=0.13, hspace=0.37) 
#fig.subplots_adjust(**adjustprops) 
ax1.plot(xv,yv, color='blue', lw=1, linestyle='dashed') 
ax1.plot(xv1,yv1, 'green', linestyle='dashed') 
ax1.plot(np.r_[-1:1:0.2],np.r_[-1:1:0.2],'red') 
ax1.plot(xc,yc, 'k.', markersize=3) 

p.savefig('colored_image.png') 

import matplotlib.image as mpimg 
import matplotlib.cm as cm 
import Image 

figprops = dict(figsize=(10,10), dpi=100) 
fig1 = p.figure(**figprops) 
#fig1 = p.figure() 
#ax1 = fig.add_subplot(111) 
adjustprops = dict() 
image=Image.open('colored_image.png').convert("L") 
arr=np.asarray(image) 
p.figimage(arr,cmap=cm.Greys_r) 
p.savefig('grayed.png') 
p.savefig('grayed.pdf',papertype='a4',orientation='portrait') 

Esto producirá un gráfico en color, de leerlo, convertir a escala de grises, y se ahorrará un png y pdf.

+1

Esta respuesta no es muy buena porque requiere rasterizar la trama y las fuentes que contiene. La rasterización ocurre cuando se convierte a .png. Sería mejor escribir un pdf en el sistema de archivos y luego convertirlo a escala de grises, tal vez usando ghostscript. –

+0

"importar imagen" ya no funciona. En su lugar, use "de PIL import Image" – warunapww

6

Actualmente es incómodo hacerlo directamente desde matplotlib, pero en "el futuro" planean admitir una llamada a set_gray(True) en la figura (consulte el hilo de la lista de correo here).

Sus mejores opciones serán para guardarlo en color y convertirlo, ya sea en pitón con PIL:

import Image 
Image.open('color.png').convert('L').save('bw.png') 

o desde la línea de comandos con ImageMagick:

convert -type Grayscale color.png bw.png 
+0

Al igual que las otras respuestas, esta respuesta no es muy satisfactoria porque rasteriza la trama. –

0

Y para añadir Solución de Mu Mind

Si por alguna razón desea evitar escribirlo en un archivo, puede usar StringIO como un archivo:


import Image 
import pylab 
from StringIO import StringIO 

pylab.plot(range(10),[x**2 for x in range(10)]) 

IO = StringIO() 
pylab.savefig(IO,format='png') 
IO.seek(0) 

#this, I stole from Mu Mind solution 
Image.open(IO).convert('L').show() 
+0

Al igual que las otras respuestas, esta respuesta no es muy satisfactoria porque rasteriza la trama. –

1

Estoy luchando con este problema también. Por lo que puedo decir, matplotlib no admite la conversión directa a escala de grises, pero puede guardar un pdf en color y luego convertirlo a escala de grises con ghostscript:

gs -sOutputFile = gray.pdf -sDEVICE = pdfwrite -sColorConversionStrategy = Gray -dProcessColorModel =/DeviceGray -dNOPAUSE -dBATCH -dAutoRotatePages =/None color.pdf

+0

¿por qué no solo utiliza la hoja de estilos de escala de grises? http://matplotlib.org/examples/style_sheets/plot_grayscale.html –

+0

Eso en realidad no convierte un gráfico de color a escala de grises. Simplemente hace que algunos elementos sean grises por defecto. Tengo trazados que quiero exportar como color para una página web y convertir a gris para imprimir. –

+0

Puede usar las hojas de estilo dentro de un administrador de contexto. Envuelva sus llamadas a una función de trazado que no sea de procesamiento de datos con esas. –

Cuestiones relacionadas