Envision is a small, easy to use Clojure library for data processing, cleanup and visualisation. If you've heard about Incanter, you may see a couple of things that we do in a similar way.
You can check out a couple of rendered examples here.
Envision is a relatively young project. Since it's never meant to be used in hard- production (e.g. it will never be something user-facing), and is intended to be used by people who'd like to yield some information from their data, it should be stable enough from the very early releases.
Envision artifacts are released to Clojars. If you are using Maven, add the following repository
definition to your pom.xml
:
<repository>
<id>clojars.org</id>
<url>http://clojars.org/repo</url>
</repository>
With Leiningen:
[clojurewerkz/envision "0.1.0-SNAPSHOT"]
With Maven:
<dependency>
<groupId>clojurewerkz</groupId>
<artifactId>envision</artifactId>
<version>0.1.0-SNAPSHOT</version>
</dependency>
Main idea of this library is to make exploratory analysis more interactive and visual, although in programmer's way. Envision creates a "throwaway environment" every time you, for example, make a line chart. You can modify chart the way you want, change all the possible configuration parameters, filter data, add exponents the ways we wouldn't be able to program for you.
We concluded that visual environments are often constraining, and creating an API for every since feature would make it amazingly big and bloated. So we do a bare minimum, which is already helpful by default through the API and let you configure everything you could've possibly imagined yourself: adding interactivity, combining charts, customizing layouts and so on.
Main entrypoint is clojurewerkz.envision.core/render
. It creates a temporary
directory with all the required dependencies and returns you a path to it. For example,
let's generate some data and render a line and area charts:
(ns my-ns
(:require [clojurewerkz.envision.core :as envision]
[clojurewerkz.envision.chart-config :as cfg]
(envision/render
[(envision/histogram 10 (take 100 (distribution/normal-distribution 5 10))
{:tick-format "s"})
(envision/linear-regression
(flatten (for [i (range 0 20)]
[{:year (+ 2000 i)
:income (+ 10 i (rand-int 10))
:series "series-1"}
{:year (+ 2000 i)
:income (+ 10 i (rand-int 20))
:series "series-2"}]
))
:year
:income
[:year :income :series])
(cfg/make-chart-config
{:id "line"
:headline "Line Chart"
:x "year"
:y "income"
:x-config {:order-rule "year"}
:series-type "line"
:data (flatten (for [i (range 0 20)]
[{:year (+ 2000 i)
:income (+ 10 i (rand-int 10))
:series "series-1"}
{:year (+ 2000 i)
:income (+ 10 i (rand-int 20))
:series "series-2"}]
))
:series "series"
:interpolation :cardinal
})
(cfg/make-chart-config
{:id "area"
:headline "Area Chart"
:x "year"
:y "income"
:x-config {:order-rule "year"}
:series-type "area"
:data (into [] (for [i (range 0 20)] {:year (+ 2000 i) :income (+ 10 i (rand-int 10))}))
:interpolation :cardinal
})
])
Function will return a tmp folder path, like:
/var/folders/1y/xr7zvp2j035bpq09whg7th5w0000gn/T/envision-1402385765815-3502705781
cd
into this path and start an HTTP Server on most systems you'd have Python 2.7 installed.
python -m SimpleHTTPServer
After that you can point your browser to
http://localhost:4000/templates/index.html
If you don't want to start an HTTP server, or don't have Python installed, just open templates/index_file.html
static file in your browser.
You can check out a couple of example graphs rendered as static files here.
We decided to use an simple HTTP server by default, since sometimes d3
doesn't like file://
protocol. However,
you can always just open templates/index_file.html
in your browser and get pretty much same result.
In order to configure chart, you have to specify:
id
, a unique string literal identifying the chartdata
, sequence of maps, where each map represents an entry to be displayedx
, key that should be taken asx
value for each rendered pointy
, key that should be taken asy
value for each rendered pointseries-type
, one ofline
,bubble
,area
andbar
for line charts, Scatterplots, area charts and barcharts, correspondingly
Optionally, you can specify:
series
, which will split your data, grouping or color-coding charts by given keys keys should be given either as a string or a vector or strings.interpolation
, interpolation type to be used in area or line chart, usually you want to uselinear
,basis
, orstep-after
, but there're more options, which will be mentioned in a corresponding section.x-config
specifies a configuration for X axis
x-config
options:
order-rule
specifies a key to sort data points onx
axis, if it's notx
override-min
overrides minimum for an axis
- Histograms
- Scatterplots
- Boxplots
- Barcharts
- Regression lines
- Cluster visualisation
Envision supports Clojure 1.4+.
To subscribe for announcements of releases, important changes and so on, please follow @ClojureWerkz on Twitter.
Envision is part of the group of libraries known as ClojureWerkz, together with Monger, Elastisch, Langohr, Welle, Titanium and several others.
Envision uses Leiningen 2. Make sure you have it installed and then run tests against all supported Clojure versions using
lein2 all test
Then create a branch and make your changes on it. Once you are done with your changes and all tests pass, submit a pull request on Github.
Copyright © 2014 Alex Petrov, Michael S. Klishin
Double licensed under the Eclipse Public License (the same as Clojure) or the Apache Public License 2.0.
Development sponsored by codecentric AG
dimple, d3 and Twitter Bootstrap sources belong to their respective owners and are lincensed on different terms, not contradicting to library license.