From mboxrd@z Thu Jan 1 00:00:00 1970 From: John Kitchin Subject: Re: Output result of source block to a file Date: Sat, 8 Jun 2019 16:40:49 -0400 Message-ID: References: <877ea041ee.fsf@gmail.com> Mime-Version: 1.0 Content-Type: multipart/alternative; boundary="0000000000000ebffa058ad5f75f" Return-path: Received: from eggs.gnu.org ([2001:470:142:3::10]:53946) by lists.gnu.org with esmtp (Exim 4.86_2) (envelope-from ) id 1hZi9B-0002F9-M9 for emacs-orgmode@gnu.org; Sat, 08 Jun 2019 16:41:07 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1hZi9A-0004xs-8Q for emacs-orgmode@gnu.org; Sat, 08 Jun 2019 16:41:05 -0400 Received: from mail-wm1-x329.google.com ([2a00:1450:4864:20::329]:33369) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1hZi99-0004vr-Pc for emacs-orgmode@gnu.org; Sat, 08 Jun 2019 16:41:04 -0400 Received: by mail-wm1-x329.google.com with SMTP id h19so6383977wme.0 for ; Sat, 08 Jun 2019 13:41:02 -0700 (PDT) In-Reply-To: List-Id: "General discussions about Org-mode." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: emacs-orgmode-bounces+geo-emacs-orgmode=m.gmane.org@gnu.org Sender: "Emacs-orgmode" To: Roger Mason Cc: org-mode-email --0000000000000ebffa058ad5f75f Content-Type: text/plain; charset="UTF-8" A similar approach as the last one should work, the problem I was having is that to print the binary string from python you have to decode it, and latin-1 seems close to right, but it puts a bunch of extra bytes in it that lead to a bad png file. I feel like this worked in Python2 with StringIO, but not in Python3 with BytesIO. John ----------------------------------- Professor John Kitchin Doherty Hall A207F Department of Chemical Engineering Carnegie Mellon University Pittsburgh, PA 15213 412-268-7803 @johnkitchin http://kitchingroup.cheme.cmu.edu On Sat, Jun 8, 2019 at 6:52 AM Roger Mason wrote: > Hello John, > > John Kitchin writes: > > > you probably figured out the "import io" and "f = io..." line are not > > necessary here. > > Indeed. > > > I couldn't figure out a reasonable way to use :results graphics link > > that didn't result in repeating the filename more than desired. These > > also both work, but seem to both require repeating the filename twice. > > > > #+BEGIN_SRC python :results graphics link :var fname="test.png" :file > "test.png" > > import matplotlib.pyplot as plt > > > > plt.plot([1, 2, 3, 1]) > > plt.savefig(fname) > > #+END_SRC > > > > #+BEGIN_SRC python :results graphics link :file "test.png" > > import matplotlib.pyplot as plt > > > > plt.plot([1, 2, 3]) > > plt.savefig("test.png") > > #+END_SRC > > > > Something like this should work, but there seem to be some extra bytes > > getting put in the png file from the decoding, and latin-1 is the only > > one I can get to work. If anyone knows how to get this to work, I am > > interested in seeing it! > > > > #+BEGIN_SRC python :results value :file "io.png" > > import matplotlib.pyplot as plt > > import io > > buf = io.BytesIO() > > > > plt.plot([1, 2, 3]) > > plt.savefig(buf, format='png') > > > > s = buf.getvalue() > > return s.decode('latin-1') > > #+END_SRC > > > > > > In general though, all of these are much more work than using > > ob-ipython, which just puts images in the buffer for you. > > I will investigate that, thanks for the tip. I began this bit of work > using gnuplot for making x-y plots, but I find that gnuplot syntax gets > messy for anything but simple data. I am not a particular fan > of python so I'm also looking into guile & racket for plotting. > > Thanks for your help, it is much appreciated. > > Roger > --0000000000000ebffa058ad5f75f Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable
A similar approach as the last one should work, the proble= m I was having is that to print the binary string from python you have to d= ecode it, and latin-1 seems close to right, but it puts a bunch of extra by= tes in it that lead to a bad png file. I feel like this worked in Python2 w= ith StringIO, but not in Python3 with BytesIO.


=
John
-----------------------------------
Professor John Kitchin=C2=A0
Do= herty Hall A207F
Department of Chemical Engineering
Carnegie Mellon U= niversity
Pittsburgh, PA 15213
412-268-7803


On Sat, Jun 8, 2019 at 6:52 AM Roger Mason <rmason@mun.ca> wrote:
Hello John,

John Kitchin <jkitchin@andrew.cmu.edu> writes:

> you probably figured out the "import io" and "f =3D io.= .." line are not
> necessary here.

Indeed.

> I couldn't figure out a reasonable way to use :results graphics li= nk
> that didn't result in repeating the filename more than desired. Th= ese
> also both work, but seem to both require repeating the filename twice.=
>
> #+BEGIN_SRC python :results graphics link :var fname=3D"test.png&= quot; :file "test.png"
> import matplotlib.pyplot as plt
>
> plt.plot([1, 2, 3, 1])
> plt.savefig(fname)
> #+END_SRC
>
> #+BEGIN_SRC python :results graphics link :file "test.png" > import matplotlib.pyplot as plt
>
> plt.plot([1, 2, 3])
> plt.savefig("test.png")
> #+END_SRC
>
> Something like this should work, but there seem to be some extra bytes=
> getting put in the png file from the decoding, and latin-1 is the only=
> one I can get to work. If anyone knows how to get this to work, I am > interested in seeing it!
>
> #+BEGIN_SRC python :results value :file "io.png"
> import matplotlib.pyplot as plt
> import io
> buf =3D io.BytesIO()
>
> plt.plot([1, 2, 3])
> plt.savefig(buf, format=3D'png')
>
> s =3D buf.getvalue()
> return s.decode('latin-1')
> #+END_SRC
>
>
> In general though, all of these are much more work than using
> ob-ipython, which just puts images in the buffer for you.

I will investigate that, thanks for the tip.=C2=A0 I began this bit of work=
using gnuplot for making x-y plots, but I find that gnuplot syntax gets
messy for anything but simple data.=C2=A0 I am not a particular fan
of python so I'm also looking into guile & racket for plotting.

Thanks for your help, it is much appreciated.

Roger
--0000000000000ebffa058ad5f75f--