Plotting in R from Clojure

One of R's strengths is its plotting ability. In this recipe, we'll see how to take some data and plot it on a graph. We won't really exercise R's graphic abilities, but this should be enough to get you started.

Getting ready

We must first complete the recipe, Setting up R to talk to Clojure, and have Rserve running. We must also have the Clojure-specific parts of that recipe done and the connection to Rserve made.

We'll need the ToR protocol and the implementations that we defined in the Passing vectors into R recipe.

Also, we'll need access to the java.io.File class:

(import '[java.io File])

How to do it…

This recipe will look a lot like a number of other R-related recipes. We'll create a function that assembles the string with the R expression and then we'll see it in action.

  1. First, we'll define a function to initialize a PNG file for output, plot some data, and save the file, all from R:
    (defn r-plot
      ([data filename] (r-plot data filename *r-cxn*))
      ([data filename r-cxn]
       (.. r-cxn
         (eval (str "png(filename=""
                    (.getAbsolutePath (File. filename))
                    "", height=300, width=250, bg="white")
    "
                    "plot(" (->r data) ")
    "
                    "dev.off()
    ")))))
  2. Now, let's test it out at the start of the Fibonacci sequence:
    user=> (r-plot [1.0 1.0 2.0 3.0 5.0 8.0 11.0] "fib.png")
    #<REXPInteger org.rosuda.REngine.REXPInteger@7342054+[1]>

    If we open up the fib.png file and take a look at it, we can see the results of the simple graphing call that we made, as shown here:

    How to do it…

How it works…

The body of this function is in the string that gets passed to R to evaluate. It's composed of three function calls. First, it initializes the PNG output with the png function:

"png(filename=""
(.getAbsolutePath (File. filename))
"", height=300, width=500, bg="white")
"

Then, we actually plot the data:

"plot(" (->r data) ")
"

Finally, save the plot to the file:

"dev.off()
"

There's more…

A scatterplot is a very basic plot, which Incanter can do as well. However, R's graphing features are more sophisticated than what Incanter can currently do. To get a taste of what R's capable of, browse through the R gallery at http://gallery.r-enthusiasts.com/.

..................Content has been hidden....................

You can't read the all page of ebook, please click here login for view all page.
Reset