4

Question: How to generate inline plot image result in Org-mode babel clojure src block?

I tried some ways:

First way: use :results file :file "clojure-babel-figure-result.png"

#+BEGIN_SRC clojure :session :results file :file "clojure-babel-figure-result.png" :dir "data/images"
(use '(incanter core stats datasets charts io pdf))

(def my-plot (histogram (sample-normal 1000)))

(save my-plot "clojure-babel-figure-result.png")
;; (view my-plot)
#+END_SRC

#+RESULTS:
[[file:/home/stardiviner/Org/Wiki/Computer Technology/Programming/Emacs/modes/Org-mode/data/images/clojure-babel-figure-result.png]]

The problem is that the generated plot image should be in upper link path. But it is save to CIDER working directory /home/stardiviner/clojure-babel-figure-result.png. or Emacs buffer working directory default-directory in /home/stardiviner/Org/Wiki/Emacs/Org-mode.

Second way: use Clojure code to specify the image path.

#+BEGIN_SRC clojure :session :results file :file "clojure-babel-figure-result.png" :var fname="clojure-babel-figure-result.png"
(use '(incanter core stats datasets charts io pdf))
(import 'java.io.FileOutputStream)

(def output-file (FileOutputStream. fname))

(def my-plot (histogram (sample-normal 1000)))

(save my-plot output-file)

(.close output-file)
;; (view my-plot)
#+END_SRC

#+RESULTS:

I found ob-clojure.el does not use fname header argument variable when I inspect variable output-file.

Is there a way to let ob-clojure.el change working directory?

I have some ideas:

  • let ob-clojure.el use babel header argument :dir as working directory.

My environment info:

  • My Emacs version: 26.0.50
  • My Org-mode version: 9.0.5

EDIT:

The issue is the generated file save to current working directory default-directory , not in Org-mode babel block specified ~:dir~ path.

For example:

#+BEGIN_SRC clojure :session :results file :dir "data/images" :var fname="clojure-babel-figure-result.png"
(use '(incanter core stats charts io))
(def my-plot (function-plot sin -10 10))
(save my-plot "clojure-babel-figure-result.png")
my-plot
#+END_SRC

#+RESULTS:
[[file:/home/stardiviner/Org/Wiki/Computer Technology/Programming/Emacs/modes/Org-mode/data/images/#object[org.jfree.chart.JFreeChart 0x49b53c9e "org.jfree.chart.JFreeChart@49b53c9e"]]]

BTW, How to make Org-mode babel generate inline image result with relative path instead of absolute path? Relative path is useful for blog publish etc.

stardiviner
  • 1,888
  • 26
  • 45
  • You may have to output your image to `stdout` instead of a file, or you may have to return the file name? – theldoria Feb 21 '17 at 05:14
  • Yes, I updated my question, maybe can return a filename. But currently it seems has ob-clojure evaluate issue. – stardiviner Feb 21 '17 at 09:48
  • Don't know if you've solved it, but this answer by @Tobias should help: https://emacs.stackexchange.com/a/46557/17896 – whatacold Dec 13 '18 at 15:59
  • Looks interesting, but that seems only work in exporting filter. And I solved this problem. Here it is. I will add answer here. https://stardiviner.github.io/Blog/Clojure-Plotting-to-Org-inline-image-in-ob-clojure.html – stardiviner Jan 22 '19 at 00:37

1 Answers1

1

By pass in target directory as path into Clojure code, and use java.io.File.renameTo to move generate plot image file to target dir.

Here is the complete story background: https://stardiviner.github.io/Blog/Clojure-Plotting-to-Org-inline-image-in-ob-clojure.html

Here is a complete example:

#+begin_src clojure :results file link :dir "data/images" :file "ob-clojure-incanter-move.png" :var dir=(concat (file-name-directory (buffer-file-name)) "data/images/")
(use '(incanter core io charts stats))
(import '(java.io File))

(def hist (histogram (sample-normal 1000)))
(save hist "ob-clojure-incanter-move.png")
(.renameTo (File. "ob-clojure-incanter-move.png") (File. (str dir "ob-clojure-incanter-move.png")))
#+end_src

#+RESULTS[<2019-01-22 08:50:16> 60e5c025a7a63284fdd7546af49e6915291a33f5]:
[[file:data/images/ob-clojure-incanter-move.png]]

stardiviner
  • 1,888
  • 26
  • 45