Parens for Pyplot
libpython-clj has opened the door for Clojure to directly interop with Python libraries. That means we can take just about any Python library and directly use it in our Clojure REPL. But what about matplotlib?
Matplotlib.pyplot is a standard fixture in most tutorials and python data science code. How do we interop with a python graphics library?
How do you interop?
It turns out that matplotlib has a headless mode where we can export the graphics and then display it using any method that we would normally use to display a .png file. In my case, I made a quick macro for it using the shell open
. I’m sure that someone out that could improve upon it, (and maybe even make it a cool utility lib), but it suits what I’m doing so far:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
|
Parens for Pyplot!
Now that we have our wrapper let’s take it for a spin. We’ll be following along more or less this tutorial for numpy plotting
For setup you will need the following installed in your python environment:
- numpy
- matplotlib
- pillow
We are also going to use the latest and greatest syntax from libpython-clj so you are going to need to install the snapshot version locally until the next version goes out:
git clone git@github.com:cnuernber/libpython-clj.git
cd cd libpython-clj
lein install
After that is all setup we can require the libs we need in clojure.
1 2 3 4 |
|
The plot
namespace contains the macro for with-show
above. The py.
and others is the new and improved syntax for interop.
Simple Sin and Cos
Let’s start off with a simple sine and cosine functions. This code will create a x
numpy vector of a range from 0 to 3 * pi
in 0.1 increments and then create y
numpy vector of the sin
of that and plot it
1 2 3 4 |
|
Beautiful yes!
Let’s get a bit more complicated now and and plot both the sin and cosine as well as add labels, title, and legend.
1 2 3 4 5 6 7 8 9 10 |
|
We can also add subplots. Subplots are when you divide the plots into different portions. It is a bit stateful and involves making one subplot active and making changes and then making the other subplot active. Again not too hard to do with Clojure.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
|
Plotting with Images
Pyplot also has functions for working directly with images as well. Here we take a picture of my cat and create another version of it that is tinted.
1 2 3 4 5 6 7 |
|
Pie charts
Finally, we can show how to do a pie chart. I asked people in a twitter thread what they wanted an example of in python interop and one of them was a pie chart. This is for you!
The original code for this example came from this tutorial.
1 2 3 4 5 6 7 8 9 10 |
|
Onwards and Upwards!
This is just the beginning. In upcoming posts, I will be showcasing examples of interop with different libraries from the python ecosystem. Part of the goal is to get people used to how to use interop but also to raise awareness of the capabilities of the python libraries out there right now since they have been historically out of our ecosystem.
If you have any libraries that you would like examples of, I’m taking requests. Feel free to leave them in the comments of the blog or in the twitter thread.
Until next time, happy interoping!
PS All the code examples are here https://github.com/gigasquid/libpython-clj-examples