Сохранение сюжета matplotlib в оттенках серого - PullRequest
18 голосов
/ 16 мая 2011

У меня есть несколько цветовых графиков, которые мне нужно сохранить в оттенках серого. Есть ли простой способ сделать это без изменения форматов печати?

Ответы [ 5 ]

6 голосов
/ 23 мая 2011

В настоящее время неловко делать это напрямую из matplotlib, но в будущем они планируют поддержать вызов set_gray(True) на рисунке (см. Ветку списка рассылки здесь ).

Лучшим вариантом будет сохранить его в цвете и преобразовать его либо в python с PIL:

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

, либо из командной строки с imagemagick:

convert -type Grayscale color.png bw.png
5 голосов
/ 29 июня 2011

На самом деле, об этом спрашивали раньше. Вот довольно хороший ответ, который на втором месте в Google (на сегодняшний день):
Отображение изображения в градациях серого с использованием matplotlib

И решение ОЧЕНЬ похоже на Суки ...

О, ну, мне скучно, поэтому я выкладываю здесь также полный код:

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

Это создаст цветной график, затем прочитает его, преобразует в оттенки серого и сохранит png и pdf.

2 голосов
/ 25 апреля 2015

Я тоже борюсь с этой проблемой.Насколько я могу судить, matplotlib не поддерживает прямое преобразование в оттенки серого, но вы можете сохранить цветной PDF, а затем преобразовать его в оттенки серого с помощью ghostscript:

gs -sOutputFile=gray.pdf -sDEVICE=pdfwrite -sColorConversionStrategy=Gray -dProcessColorModel=/DeviceGray -dNOPAUSE -dBATCH -dAutoRotatePages=/None color.pdf
1 голос
/ 12 апреля 2018

Существует простое решение:

plt.imsave(filename, image, cmap='gray')
0 голосов
/ 25 июня 2011

И добавить к решению Му Разума

Если по какой-либо причине вы хотите избежать записи в файл, вы можете использовать StringIO как файл:


 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...