SciCloj logo
This is part of the Scicloj Clojure Data Scrapbook.

Observable examples - DRAFT

(ns index
  (:require [codegen :refer [obs]]
            [scicloj.kindly.v4.kind :as kind]))

We will use the draft codegen namespace.

A basic example

Note that we read the data from a file, that we can conveniently generate in Clojure.

We follow a basic example from Quarto’s Observable docs.

(obs
 '(def athletes
    (. (FileAttachment "notebooks/datasets/athletes.csv")
       (csv {:typed true}))))
athletes = Array(11538) [Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, …]
(obs
 '(Plot.plot {:grid true
              :facet {:data athletes
                      :y "sex"}
              :marks [(Plot.rectY athletes
                                  (Plot.binX {:y "count"}
                                             {:x "weight" :fill "sex"}))
                      (Plot.ruleY [0])]}))
femalemalesex01002003004000100200300400↑ Frequency406080100120140160weight →

Interactions across components

Here, we reproduce the penguins example from the Quarto docs.

(obs
 '(viewof bill_length_min
          (Inputs.range [32 50]
                        {:value 35
                         :step 1
                         :label "Bill length (min):"}))
 '(viewof islands
          (Inputs.checkbox ["Torgersen" "Biscoe" "Dream"]
                           {:value ["Torgensen" "Biscoe"]
                            :lable "Islands:"}))
 '(. (Plot.rectY filtered
                 (Plot.binX {:y "count"}
                            {:x "body_mass_g"
                             :fill "species"
                             :thresholds 20}))
     (plot {:facet {:data filtered
                    :x "sex"
                    :y "species"
                    :marginRight 80}
            :marks [(Plot.frame)]}))
 '(Inputs.table filtered)
 '(def penguins (. (FileAttachment "notebooks/datasets/palmer-penguins.csv")
                   (csv {:typed true})))
 '(def filtered (. penguins
                   (filter [:js "function(penguin) {
                                           return bill_length_min < penguin.bill_length_mm &&
                                           islands.includes(penguin.island);
                                           }"]))))
bill_length_min = 35
islands = Array(1) ["Biscoe"]
AdelieGentoospeciesNAfemalemalesex051015051015↑ Frequency4,0006,0004,0006,0004,0006,000body_mass_g →
speciesislandbill_length_mmbill_depth_mmflipper_length_mmbody_mass_gsexyear
AdelieBiscoe37.818.31743,400female2,007
AdelieBiscoe37.718.71803,600male2,007
AdelieBiscoe35.919.21893,800female2,007
AdelieBiscoe38.218.11853,950male2,007
AdelieBiscoe38.817.21803,800male2,007
AdelieBiscoe35.318.91873,800female2,007
AdelieBiscoe40.618.61833,550male2,007
AdelieBiscoe40.517.91873,200female2,007
AdelieBiscoe37.918.61723,150female2,007
AdelieBiscoe40.518.91803,950male2,007
AdelieBiscoe39.617.71863,500female2,008
AdelieBiscoe40.118.91884,300male2,008
AdelieBiscoe4219.52004,050male2,008
AdelieBiscoe41.418.61913,700male2,008
AdelieBiscoe3917.51863,550female2,008
AdelieBiscoe40.618.81933,800male2,008
AdelieBiscoe36.516.61812,850female2,008
AdelieBiscoe37.619.11943,750male2,008
AdelieBiscoe35.716.91853,150female2,008
AdelieBiscoe41.321.11954,400male2,008
AdelieBiscoe37.6171853,600female2,008
AdelieBiscoe41.118.21924,050male2,008
AdelieBiscoe36.417.11842,850female2,008
penguins = Array(344) [Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, …]
filtered = Array(164) [Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, …]
source: projects/datavis/observable/notebooks/index.clj