9

I am using matplotlib to produce a plot which I then save to a PNG file using matplotlib.pyplot.savefig.

It all works fine, but the filesize is quite large (about 120Kb).

I can use ImageMagik afterwards (via the shell) to reduce the filesize to 38Kb without any loss of quality by reducing the number of colors and turning off dither:

convert +dither -colors 256 orig.png new.png

My question is: can I do this within matplotlib? I have searched the documentation and can't find any thing pertaining to setting the number of colors used when saving, etc....

Thanks!

ccbunney
  • 2,282
  • 4
  • 26
  • 42

3 Answers3

12

This is what I do to run matplotlib image through PIL (now Pillow)

import cStringIO
import matplotlib.pyplot as plt
from PIL import Image

...

ram = cStringIO.StringIO()
plt.savefig(ram, format='png')
ram.seek(0)
im = Image.open(ram)
im2 = im.convert('RGB').convert('P', palette=Image.ADAPTIVE)
im2.save( filename , format='PNG')
daryl
  • 1,190
  • 10
  • 19
  • 4
    This was really helpful! For Python 3, I used io.BytesIO instead of cStringIO.StringIO. See [StringIO in python3](http://stackoverflow.com/questions/11914472/stringio-in-python3) – Andrew Riker Oct 10 '16 at 16:44
3

You can pass a dpi= kwarg to savefig() which might help you reduce the filesize (depending on what you want to do with your graphs afterwards). Failing that, I think that the Python Imaging Library ( http://www.pythonware.com/products/pil/ ) will almost certainly do what you want.

FakeDIY
  • 1,425
  • 2
  • 14
  • 23
1

I don't know about doing this within matplotlib, but you could always do it using PythonMagick once you've written the file to disk.

dwurf
  • 12,393
  • 6
  • 30
  • 42
  • Thanks, but that is a wrapper for the underlying ImageMagik - was hoping for something in matplotlib. I suppose using PythonMagick makes it more Python-esque though! – ccbunney May 28 '12 at 14:08