Public
Edited
Jul 20, 2023
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
gentoo = d3.csv('https://portal.edirepository.org/nis/dataviewer?packageid=knb-lter-pal.220.7&entityid=e03b43c924f226486f2f0ab6709d2381', d3.autoType)
Insert cell
adelie = d3.csv('https://portal.edirepository.org/nis/dataviewer?packageid=knb-lter-pal.219.5&entityid=002f3893385f710df69eeebe893144ff', d3.autoType)
Insert cell
Insert cell
Insert cell
Insert cell
// Access gentoo data here:

Insert cell
// Access Adélie data here:

Insert cell
// Access chinstrap data here:

Insert cell
Insert cell
Insert cell
// Make combined version, penguinsCombo, here
penguinsCombo = adelie.concat(gentoo, chinstrap)
Insert cell
penguinsCombo
Type Table, then Shift-Enter. Ctrl-space for more options.

Insert cell
Insert cell
Insert cell
// Create the wrangled version of penguins here:
// if sex is null or "." then null else convert sex to lower case
// sex: d.Sex == null || d.Sex == "." ? null : d.Sex.toLowerCase()
penguins = penguinsCombo.map(d => ({species:d.Species.split(" ")[0],
island:d.Island,
sex: d.Sex == null || d.Sex == "." ? null : d.Sex.toLowerCase(),
bill_length_mm: d["Culmen Length (mm)"],
bill_depth_mm: d["Culmen Depth (mm)"],
body_mass_g: d["Body Mass (g)"],
flipper_length_mm: d["Flipper Length (mm)"],
}))
Insert cell
2=="2"
Insert cell
2==="2"
Insert cell
Insert cell
// penguins = penguinsKeyCopy
Insert cell
Insert cell
//the way to import from other notebooks
import {chart} from "@d3/zoomable-sunburst"
Insert cell
chart
Insert cell
Insert cell
import {aq, op} from "@uwdata/arquero"
Insert cell
Insert cell
// Convert your array of objects to an Arquero table here:
penguinsTable = aq.from(penguins)
Insert cell
penguinsTable.view()
Insert cell
Insert cell
// Write Arquero code to perform the steps above here:
//derive is like mutate in dplyr
penguinsTable
.filter(d => d.sex == "female")
.select('species', 'bill_depth_mm', 'bill_length_mm')
.derive({bill_ratio: d => d.bill_length_mm/d.bill_depth_mm})
.view()
Insert cell
// Write Arquero code to perform the steps above here:
//derive is like mutate in dplyr
mean_ratio = penguinsTable
.filter(d => d.sex == "female")
.select('species', 'bill_depth_mm', 'bill_length_mm')
.derive({bill_ratio: d => d.bill_length_mm/d.bill_depth_mm})
.groupby('species')
.rollup({mean_bill_ratio:d => op.mean(d.bill_ratio)})
.view()
Insert cell
Insert cell
Insert cell
Insert cell
penguins
X
bill_length_mm
Y
bill_depth_mm
Color
species
Size
Facet X
Facet Y
Mark
Auto
Type Chart, then Shift-Enter. Ctrl-space for more options.

Insert cell
// the scale of the dots ranges from the min value of body mass to the maximum value
//r:{domain:d3.extent(penguins.map((d) => d.body_mass_g)), range: [1,20]}
Plot.plot({
color: { legend: true },
marks: [
Plot.dot(penguins, {
x: "bill_length_mm",
y: "bill_depth_mm",
// stroke: "species",
fill: "species",
r: "body_mass_g",
opacity: 0.5,
tip: true
}),
Plot.frame()
],
color:{range:["teal", "darkorange", "orchid"]},
r:{domain:d3.extent(penguins.map((d) => d.body_mass_g)), range: [1,10]}
})
Insert cell
Insert cell
Insert cell
import {PlotMatrix} with {data} from "@observablehq/autoplot-matrix"
Insert cell
Insert cell
// Make a copy of penguins here, stored as data:
data = penguins
Insert cell
Insert cell
// Make the pairplot with PlotMatrix here:
PlotMatrix(data)
Insert cell
Insert cell
Insert cell
penguins
X
body_mass_g
Y
Color
species
Size
Facet X
Facet Y
species
Mark
Auto
Type Chart, then Shift-Enter. Ctrl-space for more options.

Insert cell
viewof chooseVariable = Inputs.radio(["bill_depth_mm", "bill_length_mm", "flipper_length_mm", "body_mass_g"], {label: "Select one", value: "body_mass_g"})
Insert cell
Plot.plot({
color: { legend: true },
marks: [
Plot.frame({ strokeOpacity: 0.1 }),
Plot.rectY(
penguins,
Plot.binX(
{ y: "count" },
{ fy: "species", x: chooseVariable, fill: "species", tip: true }
)
),
Plot.ruleY([0])
]
})
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
import {scale} from "@chrispahm/hierarchical-clustering"
Insert cell
penguins
Type Table, then Shift-Enter. Ctrl-space for more options.

Insert cell
// Make a subset of penguins with complete cases (filter out values where bill length is null):
penguinsComplete = penguins.filter((d) => d.bill_length_mm !== null)// && d.sex == "female")
Insert cell
// Create a scaled version of the values (non-numeric will be NaN, which is fine..):
penguinsScale = scale(penguinsComplete)
Insert cell
// Convert the array of objects to an array of arrays:
penguinsArray = penguinsScale.map(
(d) => [d.bill_length_mm, d.bill_depth_mm, d.body_mass_g, d.flipper_length_mm]
)
Insert cell
Insert cell
Insert cell
// Use ml.js KMeans() method to perform k-means clustering for k centroids:
//we tell that we want to try with 3 centroids.
//optimizing the number of clusters is key for this, having a different number will give us totally different results
penguinsCluster = ML.KMeans(penguinsArray, 3)
Insert cell
//array of values that is in the order of the original array of values
penguinsCluster.clusters
Insert cell
Insert cell
// Combine the cluster values for each element with the original female penguins data:
//penguins.filter(d => d.sex == "female")
//penguinsArray.concat(penguinsCluster.cluster)
penguinsKmeans = penguins.filter((d) => d.bill_length_mm != null)
Insert cell
penguinsDTC = penguinsKmeans.map((d,i) => ({...d, clusterNo:penguinsCluster.clusters[i]}))
Insert cell
penguinsDTC
Type Table, then Shift-Enter. Ctrl-space for more options.

Insert cell
Insert cell
penguinsDTC
X
flipper_length_mm
Y
body_mass_g
Color
clusterNo
Size
Facet X
Facet Y
species
Mark
Auto
Type Chart, then Shift-Enter. Ctrl-space for more options.

Insert cell
//To embed the chart as HTML or to send it as a link to someone it needs to have a name
// go to the cell menu > embed

myChart = Plot.plot({
color: { legend: true },
marks: [
Plot.frame({ strokeOpacity: 0.1 }),
Plot.dot(penguinsDTC, {
fy: "species",
x: "bill_length_mm",
y: "bill_depth_mm",
stroke: "clusterNo",
tip: true
})
]
})
Insert cell
Insert cell
Insert cell
ML = require("https://www.lactame.com/lib/ml/6.0.0/ml.min.js")
Insert cell
import {penguinsKeyCopy} from "@observablehq/ds-workflows-in-js-session-2-key"
Insert cell
noUse = FileAttachment("fiddlerCrabBodySize.csv") // Note: this is only added here so that the file is attached in the forked version
Insert cell

Purpose-built for displays of data

Observable is your go-to platform for exploring data and creating expressive data visualizations. Use reactive JavaScript notebooks for prototyping and a collaborative canvas for visual data exploration and dashboard creation.
Learn more