I wish I could say that it was because of a deep understanding of the inner 
workings of matplotlib or a rock solid grasp of python 3's bytes vs strings, 
but it wasn't.   fig.savefig threw the "TypeError: string argument expected, 
got 'bytes'" exception, so I figured BytesIO might work better with the binary 
png data than StringIO, and it did.  Your image URI included base64 encoding I 
added the base64 code and fiddled with decoding to get it to produce ASCII.  
iPython is great for this sort of playing around with snippets of code.

btw, if you are not aware of the pros and cons of using data uri's to embed 
images take a look at this Wikipedia page for some helpful information
http://en.wikipedia.org/wiki/Data_URI_scheme

Apologies if you were expecting a more detailed answer,
Scott


On Nov 1, 2014, at 4:37 PM, Julien Hillairet <julien.hillai...@gmail.com> wrote:

> Indeed, it works also for me with Python 3.3.5. 
> 
> Could you explain the changes you made and the reasons behind the byte/string 
> encoding ? 
> 
> Best regards,
> 
> 2014-11-01 17:21 GMT+01:00 Scott Lasley <slas...@space.umd.edu>:
> This works for me with python 3.4.2
> 
> import matplotlib.pyplot as plt
> from io import BytesIO
> import base64
> 
> fig = plt.figure()
> ax = fig.add_subplot(111)
> ax.plot([1,2,3])
> 
> sio = BytesIO()
> 
> fig.savefig(sio, format="png")
> 
> html = """<html><body>
> <img src="data:image/png;base64,{}"/>
> </body></html>""".format(base64.encodebytes(sio.getvalue()).decode())
> 
> 
> For python 2.7.8 change html =""" to
> 
> html = """<html><body>
> <img src="data:image/png;base64,%s"/>
> </body></html>""" % base64.encodestring(sio.getvalue())
> 
> Best regards,
> Scott
> 
> 
> On Nov 1, 2014, at 7:37 AM, Julien Hillairet <julien.hillai...@gmail.com> 
> wrote:
> 
> > Dear all,
> > I'm trying to write a html page content in which a png figure is generated 
> > by matplotlib, with Python3.
> > However, the following piece of code does not work with matplotlib/Python3 
> > (while it should work with Python2). The error is the following on
> > TypeError: string argument expected, got 'bytes'
> > when on fig.savefig(sio, format="png")
> > Could someone explain me how to do it ?
> > Best regards,
> > Julien
> >
> > --------------------------------------------
> >
> > import matplotlib.pyplot as plt
> >
> > from io import StringIO
> > fig = plt.figure()
> > ax = fig.add_subplot(111)
> > ax.plot([1,2,3])
> >
> > sio = StringIO()
> >
> > fig.savefig(sio, format="png")
> >
> > html = """<html><body>
> > ...a bunch of text and html here...
> > <img src="data:image/png;base64,%s"/>
> > ...more text and html...
> > </body></html>""" % sio.getvalue().strip()
> >
> > ------------------------------------------------------------------------------


------------------------------------------------------------------------------
_______________________________________________
Matplotlib-users mailing list
Matplotlib-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/matplotlib-users

Reply via email to