Bobbi Towers / Dec 27 2019
Using plotly with Clojure
Translated from: https://plot.ly/javascript/
Select the plotly viewer via the :nextjournal/viewer
metadata attribute, and provide the :data
and :layout
information.
Scatter charts
Basic line chart
{:nextjournal/viewer :plotly}
{:data [{:x [1 2 3 4 5] :y [1 2 4 8 16]}]
:layout {:title "My Awesome Line Chart"
:xaxis1 {:title "year"} :yaxis1 {:title "revenue"}
:margin {:t 50 :l 50}}}
0.1s
Clojure
Loading viewer…
Line dash styles
(def trace1
{:x [1 2 3 4 5] :y [6 8 7 8 6]
:mode "lines" :name "dashdot"
:line {:dash "dashdot" :width 4}})
(def trace2
{:x [1 2 3 4 5] :y [11 13 12 13 11]
:mode "lines" :name "Solid"
:line {:dash "solid" :width 4}})
(def trace3
{:x [1 2 3 4 5] :y [16 18 17 18 16]
:mode "lines" :name "dot"
:line {:dash "dot" :width 4}})
(def layout
{:title "Line Dash Styles"
:xaxis {:range [0.75 5.25] :autorange false}
:yaxis {:range [0 18.5] :autorange false}
:legend {:y 0.5 :traceorder "reversed" :font {:size 16}}
:margin {:t 50}})
{:nextjournal/viewer :plotly}
{:data [trace1 trace2 trace3] :layout layout}
0.2s
Clojure
Loading viewer…
Fancy annotated line chart
(def xData
[[2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2013]
[2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2013]
[2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2013]
[2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2013]])
(def yData
[[74 82 80 74 73 72 74 70 70 66 66 69]
[45 42 50 46 36 36 34 35 32 31 31 28]
[13 14 20 24 20 24 24 40 35 41 43 50]
[18 21 18 21 16 14 13 18 17 16 19 23]])
(def colors
["rgba(67,67,67,1)" "rgba(115,115,115,1)"
"rgba(49,130,189, 1)" "rgba(189,189,189,1)"])
(def lineSize
[2 2 4 2])
(def labels
["Television" "Newspaper" "Internet" "Radio"])
(def data
(loop [i 0 data []]
(if (< i (count xData))
(recur (inc i)
(conj data
{:x (nth xData i) :y (nth yData i)
:type "scatter" :mode "lines"
:line {:color (nth colors i) :width (nth lineSize i)}}
{:x [(first (nth xData i)) (nth (nth xData i) 11)]
:y [(first (nth yData i)) (nth (nth yData i) 11)]
:type "scatter" :mode "markers"
:marker {:color (nth colors i) :size 12}}))
data)))
(def annotations
(loop [i 0 annotations
[{:xref "paper" :yref "paper"
:x 0.0 :y 1.05
:xanchor "left" :yanchor "bottom"
:text "Main Source for News"
:font {:family "Arial" :size 30 :color "rgb(37,37,37)"}
:showarrow false}
{:xref "paper" :yref "paper"
:x 0.5 :y -0.1 :xanchor "center" :yanchor "top"
:text "Source: Pew Research Center & Storytelling with data"
:showarrow false
:font {:family "Arial" :size 12 :color "rgb(150,150,150)"}}]]
(if (< i (count xData))
(recur (inc i)
(conj annotations
{:xref "paper"
:x 0.05 :y (first (nth yData i))
:xanchor "right" :yanchor "middle"
:text (str (nth labels i) " " (first (nth yData i)) "%")
:showarrow false
:font {:family "Arial" :size 16 :color "black"}}
{:xref "paper"
:x 0.95 :y (nth (nth yData i) 11)
:xanchor "left" :yanchor "middle"
:text (str (nth (nth yData i) 11) "%")
:font {:family "Arial" :size 16 :color "black"}
:showarrow false}))
annotations)))
(def layout
{:showlegend false
:height 600 :width 600
:xaxis {:showline true :showgrid false :showticklabels true
:linecolor "rgb(204,204,204)" :linewidth 2
:autotick false :ticks "outside"
:tickcolor "rgb(204,204,204)" :tickwidth 2 :ticklen 5
:tickfont {:family "Arial" :size 12 :color "rgb(82, 82, 82)"}}
:yaxis {:showgrid false :zeroline false
:showline false :showticklabels false}
:autosize false
:margin {:autoexpand false :l 100 :r 20 :t 100}
:annotations annotations})
{:nextjournal/viewer :plotly}
{:data data :layout layout}
0.8s
Clojure
Area chart
(def trace1
{:x [1 2 3 4] :y [0 2 3 5]
:fill "tozeroy" :type "scatter"})
(def trace2
{:x [1 2 3 4] :y [3 5 1 7]
:fill "tonexty" :type "scatter"})
{:nextjournal/viewer :plotly}
{:data [trace1 trace2]
:layout {:title "My Awesome Area Chart"
:margin {:t 50 :l 50}}}
0.1s
Clojure
Loading viewer…
(def traces
[{:x [1 2 3] :y [2 1 4] :stackgroup "one"}
{:x [1 2 3] :y [1 1 2] :stackgroup "one"}
{:x [1 2 3] :y [3 0 2] :stackgroup "one"}])
{:nextjournal/viewer :plotly}
{:data traces
:layout {:title "My Awesome Stacked Chart"
:margin {:t 50 :l 50}}}
0.1s
Clojure
Loading viewer…
Tables
(def header
[["<b>EXPENSES</b>"] ["<b>Q1</b>"] ["<b>Q2</b>"] ["<b>Q3</b>"] ["<b>Q4</b>"]])
(def values
[["Salaries" "Office" "Merchandise" "Legal" "<b>TOTAL</b>"]
[1200000 20000 80000 2000 12120000]
[1300000 20000 70000 2000 130902000]
[1300000 20000 120000 2000 131222000]
[1400000 20000 90000 2000 14102000]])
{:nextjournal/viewer :plotly}
{:data [{:header {:values header
:fill {:color "blue"}
:font {:family "Arial" :size 14 :color "white"}
:line {:color "black" :width 1}}
:cells {:values values
:align "center"
:fill {:color [["yellow" "turquoise" "yellow"
"turquoise" "magenta"]]}
:font {:family "Arial" :size 12 :color ["black"]}}
:type "table"}]
:layout {:title "My Awesome Table" :margin {:t 50}}}
0.1s
Clojure
Loading viewer…
Pie chart
{:nextjournal/viewer :plotly}
{:data [{:values [19 26 55]
:labels ["Residential" "Non-Residential" "Utility"]
:type "pie"}]
:layout {:height 400 :width 500}}
0.1s
Clojure
Loading viewer…
Bar chart
{:nextjournal/viewer :plotly}
{:data [{:x [1971 1969 1973 1972 1970] :y [4 3 3 3 3] :type "bar"}]
:layout {:autosize false :width 600 :height 500
:type "bar" :title "My Awesome Bar Chart"
:xaxis1 {:title "Year"} :yaxis1 {:title "# of Albums"}
:margin {:t 50 :l 50}}}
0.1s
Clojure
Loading viewer…
Gauge chart
(def level 120)
(def path
(str "M -0.0 -0.025 L 0.0 0.025 L "
(* 0.5 (Math/cos (/ (* (- 180 level) Math/PI) 180))) " "
(* 0.5 (Math/sin (/ (* (- 180 level) Math/PI) 180))) " Z"))
(def data
[{:type "scatter" :x [0] :y [0] :marker {:size 28 :color "850000"}
:showlegend false :name "speed" :text level :hoverinfo "text+name"}
{:values [8.34 8.34 8.34 8.34 8.34 8.34 50] :rotation 90
:text ["TOO FAST!" "Pretty Fast" "Fast" "Average" "Slow" "Super Slow" ""]
:textinfo "text" :textposition "inside"
:marker {:colors ["red" "orange" "yellow" "green" "blue" "violet" "white"]}
:labels ["151-180" "121-150" "91-120" "61-90" "31-60" "0-30" ""]
:hoverinfo "label" :hole 0.5 :type "pie" :showlegend false}])
(def layout
{:shapes [{:type "path" :path path
:fillcolor "850000" :line {:color "850000"}}]
:title "<b>Gauge</b> <br> Speed 0-100"
:height 1000 :width 1000
:xaxis {:zeroline false :showticklabels false
:showgrid false :range [-1 1]}
:yaxis {:zeroline false :showticklabels false
:showgrid false :range [-1 1]}
:margin {:t 80}})
{:nextjournal/viewer :plotly}
{:data data :layout layout}
0.1s
Clojure
Loading viewer…
Arbitrary SVG Paths
(def data
[{:x [2 1 6 6]
:y [0.5 9 1.5 5.5]
:text ["filled triangle" "filled Polygon"
"Quadratic Bezier Curves" "Cubic Bezier Curves"]
:mode "text"}])
(def layout
{:title "Basic Arbitrary SVG Paths"
:xaxis {:range [0 9]
:zeroline false}
:yaxis {:range [0 11]
:showgrid false}
:width 500
:height 500
:margin {:t 80}
:shapes [
;;Quadratic Bezier Curves
{:type "path"
:path "M 4,4 Q 6,0 8,4"
:line {:color "rgb(93, 164, 214)"}}
;;Cubic Bezier Curves
{:type "path"
:path "M 1,4 C 2,8 6,4 8,8"
:line {:color "rgb(207, 114, 255)"}}
;;Filled Triangle
{:type "path"
:path "M 1 1 L 1 3 L 4 1 Z"
:fillcolor "rgba(44, 160, 101, 0.5)"
:line {:color "rgb(44, 160, 101)"}}
;;Filled Polygon
{:type "path"
:path "M 3,7 L2,8 L2,9 L3,10, L4,10 L5,9 L5,8 L4,7 Z"
:fillcolor "rgba(255, 140, 184, 0.5)"
:line {:color "rgb(255, 140, 184)"}}]})
{:nextjournal/viewer :plotly}
{:data data :layout layout}
0.5s
Clojure
Shift+Enter to run
Clojure