Hello r/emacs
! First-time poster here!
I recently wanted to visualise some data in org-mode using a Python source block to generate an image, which was then rendered directly in the buffer.
It took my a couple of goes to work out how to do it.
Given some data like this:
#+begin_src bash :results output file :file data.njson
echo '{"name": "Spock", "editor": "Emacs"}
{"name": "James Kirk", "editor": "Vim"}
{"name": "Dr McCoy", "editor": "Vim"}
{"name": "Scotty", "editor": "Emacs"}
{"name": "Worf", "editor": "ed"}
{"name": "Geordi LaForge", "editor": "Emacs"}
{"name": "Data", "editor": "Emacs"}
{"name": "Jean-luc Picard", "editor": "VS Code"}
{"name": "Wesley Crusher", "editor": "VS Code"}
{"name": "William Riker", "editor": "Vim"}
'
#+end_src
A visualisation can be rendered as follows:
#+begin_src python :results output file :file usage.png
import pandas as pd
import seaborn as sns
import sys
df = pd.read_json("data.njson", lines=True)
axes = sns.histplot(df, x="editor")
axes.get_figure().savefig(sys.stdout.buffer)
#+end_src
The main trick here is to set the :results output file
header argument to write the output to a file, and to save the figure to sys.stdout.buffer
from Python.
I’ve written about this on my blog too, where you can see the [unsurprising] results of the analysis!