Python 以灰度保存matplotlib绘图

Python 以灰度保存matplotlib绘图,python,matplotlib,Python,Matplotlib,我有一些彩色图,我需要保存在灰度。有没有一种简单的方法可以在不更改打印格式的情况下完成此操作?目前直接从matplotlib执行此操作很难,但在“未来”中,他们计划支持图形上的set\u gray(True)调用(参见邮件列表线程) 您最好的选择是将其保存为彩色并转换为python和PIL: import Image Image.open('color.png').convert('L').save('bw.png') 或者使用imagemagick从命令行: convert -type Gr

我有一些彩色图,我需要保存在灰度。有没有一种简单的方法可以在不更改打印格式的情况下完成此操作?

目前直接从matplotlib执行此操作很难,但在“未来”中,他们计划支持图形上的
set\u gray(True)
调用(参见邮件列表线程)

您最好的选择是将其保存为彩色并转换为python和PIL:

import Image
Image.open('color.png').convert('L').save('bw.png')
或者使用imagemagick从命令行:

convert -type Grayscale color.png bw.png

并加入到Mu Mind的解决方案中

如果出于任何原因,您希望避免将其写入文件,您可以像使用文件一样使用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()

事实上,这是以前问过的。这是一个非常好的答案,在谷歌排名第二(截至今天):

这个解决方案和Suki的非常相似

哦,好吧,我很无聊,所以我在这里发布了一个完整的代码:

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。

我也在努力解决这个问题。据我所知,matplotlib不支持直接转换为灰度,但您可以保存彩色pdf,然后使用ghostscript将其转换为灰度:

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

有一个简单的解决方案:

plt.imsave(filename, image, cmap='gray')

关于这一点有一些讨论,见。不知道最新版本的matplotlib中是否提供了
set\u gray
属性。您可以在之后使用imagemagick:
convert-type Grayscale old.png new.png
我认为已经启用了一些功能,因此cf这个答案不是很好,因为它需要栅格化绘图和其中的任何字体。光栅化在转换为.png时发生。最好将pdf文件写入文件系统,然后将其转换为灰度,也许可以使用ghostscript。“导入图像”不再有效。与其他答案一样,使用“from PIL import Image”(从PIL导入图像),此答案不太令人满意,因为它将图形光栅化。与其他答案一样,此答案不太令人满意,因为它将图形光栅化。为什么不使用灰度样式表呢?这实际上不会将颜色打印转换为灰度。默认情况下,它只会使某些元素变为灰色。我有一些绘图要导出为网页的颜色,并转换为灰色进行打印。您可以在上下文管理器中使用样式表。用这些函数包装对非数据处理绘图函数的调用。我不理解这个建议。为什么上下文管理器有帮助?数据处理是如何相关的?如果绘图函数进行大量数据处理,多次调用它会降低程序的速度。但是,预处理数据,然后在一个彩色的、然后是灰度样式的上下文管理器中调用一个更简单的绘图函数应该是非常容易管理的。