63
Keming Labs Kevin Lynagh 2012 July 20 OSCON @lynaghk Declarative web data visualization using ClojureScript Friday, July 20, 12

Declarative web data visualization using ClojureScript

Embed Size (px)

Citation preview

Page 2: Declarative web data visualization using ClojureScript

Agenda

Friday, July 20, 12

Page 3: Declarative web data visualization using ClojureScript

Agenda

?1WhatVisualization

is

Friday, July 20, 12

Page 4: Declarative web data visualization using ClojureScript

Agenda

2doin’ itInternetson the

Friday, July 20, 12

Page 5: Declarative web data visualization using ClojureScript

Agenda

3Examplean

Friday, July 20, 12

Page 6: Declarative web data visualization using ClojureScript

Agenda

4Why

(not)

ClojureFriday, July 20, 12

Page 7: Declarative web data visualization using ClojureScript

Agenda

0 Talk

Anti-

Techideas

Friday, July 20, 12

Page 8: Declarative web data visualization using ClojureScript

Friday, July 20, 12

Page 9: Declarative web data visualization using ClojureScript

?1WhatVisualization

is

Friday, July 20, 12

Page 10: Declarative web data visualization using ClojureScript

Bioinformatics

Friday, July 20, 12

Page 11: Declarative web data visualization using ClojureScript

Wind energy

Friday, July 20, 12

Page 12: Declarative web data visualization using ClojureScript

Doc & patient,meet

DataFriday, July 20, 12

Page 13: Declarative web data visualization using ClojureScript

Friday, July 20, 12

Page 14: Declarative web data visualization using ClojureScript

Friday, July 20, 12

Page 15: Declarative web data visualization using ClojureScript

(didn’t make this, just ♥ it)

Friday, July 20, 12

Page 16: Declarative web data visualization using ClojureScript

?Whathave in

common do these things

Friday, July 20, 12

Page 17: Declarative web data visualization using ClojureScript

Data

VisualFriday, July 20, 12

Page 18: Declarative web data visualization using ClojureScript

0 25 50 75 100

Data: [17, 26, 53, 96]

Friday, July 20, 12

Page 19: Declarative web data visualization using ClojureScript

0

5

10

15

20

0 3 6 9 12 15

Data: [[1, 2] [3, 4] [5, 5] [6, 8] [8, 13] [9, 16] [11, 18]]

Friday, July 20, 12

Page 20: Declarative web data visualization using ClojureScript

Agenda

2doin’ itInternetson the

Friday, July 20, 12

Page 21: Declarative web data visualization using ClojureScript

D3: Data Driven Documents (2011)Mike Bostock Vadim OgievetskyJeffrey Heer

+

Friday, July 20, 12

Page 22: Declarative web data visualization using ClojureScript

D3 (JavaScript)

DOM

d3.select("body").selectAll("div")  .data([17, 26, 53, 96])  .enter().append("div")  .style("width", function(d){d+"px";});

Friday, July 20, 12

Page 23: Declarative web data visualization using ClojureScript

Awesome Declarative

Familiar representationHTML, CSS, SVG; dev toolsNo reinvented wheels

Easy to think, exploreOptimizable

Friday, July 20, 12

Page 24: Declarative web data visualization using ClojureScript

Awesomer Clojure(Script)

Rich data structuresNamespacesDeliberate state/mutation

Friday, July 20, 12

Page 25: Declarative web data visualization using ClojureScript

ClojurePhilosophy

Friday, July 20, 12

Page 26: Declarative web data visualization using ClojureScript

Treat yourlike Datadata

It is better to have 100 functions operate on one data structure than 10 functions on 10 data structures.

Alan Perlis

Friday, July 20, 12

Page 27: Declarative web data visualization using ClojureScript

D3 (JavaScript)d3.select("body").selectAll("div")  .data([17, 26, 53, 96])  .enter().append("div")  .style("width", function(d){d+"px";});

Friday, July 20, 12

Page 28: Declarative web data visualization using ClojureScript

D3 (JavaScript)d3.select("body").selectAll("div")  .data([17, 26, 53, 96])  .enter().append("div")  .style("width", function(d){d+"px";});

Friday, July 20, 12

Page 29: Declarative web data visualization using ClojureScript

D3 (JavaScript)d3.select("body").selectAll("div")  .data([17, 26, 53, 96])  .enter().append("div")  .style("width", function(d){d+"px";});

Can we do better?Friday, July 20, 12

Page 30: Declarative web data visualization using ClojureScript

Agenda

3Examplean

Friday, July 20, 12

Page 31: Declarative web data visualization using ClojureScript

Friday, July 20, 12

Page 32: Declarative web data visualization using ClojureScript

Friday, July 20, 12

Page 33: Declarative web data visualization using ClojureScript

[{:flight-no 2, :price 106, :carrier "Alaska" :depart 16.91, :arrive 21.42}

{:flight-no 1, :price 190, :carrier "United" :depart 6.20, :arrive 10.87}

{:flight-no 5, :price 213, :carrier "United" :depart 4.73, :arrive 9.48} ... ]

Start with your data

Friday, July 20, 12

Page 34: Declarative web data visualization using ClojureScript

Friday, July 20, 12

Page 35: Declarative web data visualization using ClojureScript

Friday, July 20, 12

Page 36: Declarative web data visualization using ClojureScript

(unify! "#chart" flight-data (fn [{:keys [price carrier depart arrive]} idx] [:div.row [:button.price (str "$" price)] [:div.flight {:style {:left (time-scale depart) :width (time-scale (- arrive depart))} :carrier carrier} [:span carrier]]]))

Friday, July 20, 12

Page 37: Declarative web data visualization using ClojureScript

(unify! "#chart" flight-data (fn [{:keys [price carrier depart arrive]} idx] [:div.row [:button.price (str "$" price)] [:div.flight {:style {:left (time-scale depart) :width (time-scale (- arrive depart))} :carrier carrier} [:span carrier]]]))

Friday, July 20, 12

Page 38: Declarative web data visualization using ClojureScript

(unify! "#chart" flight-data (fn [{:keys [price carrier depart arrive]} idx] [:div.row [:button.price (str "$" price)] [:div.flight {:style {:left (time-scale depart) :width (time-scale (- arrive depart))} :carrier carrier} [:span carrier]]]))

Friday, July 20, 12

Page 39: Declarative web data visualization using ClojureScript

(unify! "#chart" flight-data (fn [{:keys [price carrier depart arrive]} idx] [:div.row [:button.price (str "$" price)] [:div.flight {:style {:left (time-scale depart) :width (time-scale (- arrive depart))} :carrier carrier} [:span carrier]]]))

Friday, July 20, 12

Page 40: Declarative web data visualization using ClojureScript

(unify! "#chart" flight-data (fn [{:keys [price carrier depart arrive]} idx] [:div.row [:button.price (str "$" price)] [:div.flight {:style {:left (time-scale depart) :width (time-scale (- arrive depart))} :carrier carrier} [:span carrier]]]))

(let [time-scale (scale/linear :domain [0 24] :range :percent)]

(time-scale 0) ;=> “0%” (time-scale 12) ;=> “50%” (time-scale 24) ;=> “100%”)

Friday, July 20, 12

Page 41: Declarative web data visualization using ClojureScript

(unify! "#chart" flight-data (fn [{:keys [price carrier depart arrive]} idx] [:div.row [:button.price (str "$" price)] [:div.flight {:style {:left (time-scale depart) :width (time-scale (- arrive depart))} :carrier carrier} [:span carrier]]]))

Friday, July 20, 12

Page 42: Declarative web data visualization using ClojureScript

(unify! "#chart" flight-data (fn [{:keys [price carrier depart arrive]} idx] [:div.row [:button.price (str "$" price)] [:div.flight {:style {:left (time-scale depart) :width (time-scale (- arrive depart))} :carrier carrier} [:span carrier]]]))

Friday, July 20, 12

Page 43: Declarative web data visualization using ClojureScript

(unify! "#chart" flight-data (fn [{:keys [price carrier depart arrive]} idx] [:div.row [:button.price (str "$" price)] [:div.flight {:style {:left (time-scale depart) :width (time-scale (- arrive depart))} :carrier carrier} [:span carrier]]]))

Friday, July 20, 12

Page 44: Declarative web data visualization using ClojureScript

(unify! "#chart" flight-data (fn [{:keys [price carrier depart arrive]} idx] [:div.row [:button.price (str "$" price)] [:div.flight {:style {:left (time-scale depart) :width (time-scale (- arrive depart))} :carrier carrier} [:span carrier]]]))

Friday, July 20, 12

Page 45: Declarative web data visualization using ClojureScript

(unify! "#chart" flight-data (fn [{:keys [price carrier depart arrive]}] [:div.row [:button.price (str "$" price)] [:div.flight {:style {:left (time-scale depart) :width (time-scale (- arrive depart))} :carrier carrier} [:span carrier]]]))

Friday, July 20, 12

Page 46: Declarative web data visualization using ClojureScript

(map flight-data (fn [{:keys [price carrier depart arrive]}] [:div.row [:button.price (str "$" price)] [:div.flight {:style {:left (time-scale depart) :width (time-scale (- arrive depart))} :carrier carrier} [:span carrier]]]))

Friday, July 20, 12

Page 47: Declarative web data visualization using ClojureScript

(map flight-data (fn [{:keys [price carrier depart arrive]}] [:div.row [:button.price (str "$" price)] [:div.flight {:style {:left (time-scale depart) :width (time-scale (- arrive depart))} :carrier carrier} [:span carrier]]]))

Friday, July 20, 12

Page 48: Declarative web data visualization using ClojureScript

C2http://keminglabs.com/c2http://github.com/lynaghk/c2

Friday, July 20, 12

Page 49: Declarative web data visualization using ClojureScript

Advantagesof the

dataapproach

Friday, July 20, 12

Page 50: Declarative web data visualization using ClojureScript

Declarative

(fn [{:keys [price carrier depart arrive]}] [:div.row [:button.price (str "$" price)] [:div.flight {:style {:left (time-scale depart) :width (time-scale (- arrive depart))} :carrier carrier} [:span carrier]]])

Friday, July 20, 12

Page 51: Declarative web data visualization using ClojureScript

Declarative

(fn [{:keys [price carrier depart arrive]}] [:div.row [:button.price (str "$" price)] [:div.flight {:style (flight-style depart arrive)

:carrier carrier} [:span carrier]]])

Friday, July 20, 12

Page 52: Declarative web data visualization using ClojureScript

Declarative

(fn [{:keys [price carrier depart arrive]}] [:div.row [:button.price (str "$" price)] [:div.flight {:style (merge {:background-color "blue"} (flight-style depart arrive)) :carrier carrier} [:span carrier]]])

Friday, July 20, 12

Page 53: Declarative web data visualization using ClojureScript

Decoupled2) rendering1) construction

Friday, July 20, 12

Page 54: Declarative web data visualization using ClojureScript

Agenda

4Why

(not)

ClojureFriday, July 20, 12

Page 55: Declarative web data visualization using ClojureScript

Why Clojure

SaneOpinionated

&Friday, July 20, 12

Page 56: Declarative web data visualization using ClojureScript

Why Clojure

Runtimes:JVMCLR

JavaScript

Lua CFriday, July 20, 12

Page 57: Declarative web data visualization using ClojureScript

NotClojure

Friday, July 20, 12

Page 58: Declarative web data visualization using ClojureScript

Why not Clojure

WTFis Clojure?

Friday, July 20, 12

Page 59: Declarative web data visualization using ClojureScript

Why not Clojure

Clojure is the #23 most popular language on GitHub

Friday, July 20, 12

Page 60: Declarative web data visualization using ClojureScript

Why not Clojure

Assembly is the #18 most popular language on GitHub

Friday, July 20, 12

Page 61: Declarative web data visualization using ClojureScript

Why not Clojure

900+ forks

Friday, July 20, 12

Page 62: Declarative web data visualization using ClojureScript

Friday, July 20, 12

Page 63: Declarative web data visualization using ClojureScript

Keming Labs

Kevin Lynagh@lynaghk

Friday, July 20, 12