The fine folks over at @ObservableHQ released a new javascript exploratory visualization library called Plot last week with great fanfare. It was primarily designed to be used in Observable notebooks and I quickly tested it out there (you can find them at my Observable landing page: https://observablehq.com/@hrbrmstr).
{Plot} doesn’t require Observable, however, and I threw together a small example that dynamically tracks U.S. airline passenger counts by the TSA to demonstrate how to use it in a plain web page.
It’s small enough that I can re-create it here:
TSA Total Traveler Throughput 2021 vs 2020 vs 2019 (same weekday)
and include the (lightly annotated) source:
fetch(
"https://observable-cors.glitch.me/https://www.tsa.gov/coronavirus/passenger-throughput",
{
cache: "no-store",
mode: "cors",
redirect: "follow"
}
)
.then((response) => response.text()) // we get the text here
.then((html) => {
var parser = new DOMParser();
var doc = parser.parseFromString(html, "text/html"); // we turn it into DOM elements here
// some helpers to make the code less crufty
// first a function to make proper dates
var as_date = d3.timeParse("%m/%d/%Y");
// and, now, a little function to pull a specific <table> column and
// convert it to a proper numeric array. I would have put this inline
// if we were only converting one column but there are three of them,
// so it makes sense to functionize it.
var col_double = (col_num) => {
return Array.from(
doc.querySelectorAll(`table tbody tr td:nth-child(${col_num})`)
).map((d) => parseFloat(d.innerText.trim().replace(/,/g, "")));
};
// build an arquero table from the scraped columns
var flights = aq
.table({
day: Array.from(
doc.querySelectorAll("table tbody tr td:nth-child(1)")
).map((d) => as_date(d.innerText.trim().replace(/.{4}$/g, "2021"))),
y2021: col_double(2),
y2020: col_double(3),
y2019: col_double(4)
})
.orderby("day")
.objects()
.filter((d) => !isNaN(d.y2021))
document.getElementById('vis').appendChild(
Plot.plot({
marginLeft: 80,
x: {
grid: true
},
y: {
grid: true,
label: "# Passengers"
},
marks: [
Plot.line(flights, { x: "day", y: "y2019", stroke: "#4E79A7" }),
Plot.line(flights, { x: "day", y: "y2020", stroke: "#F28E2B" }),
Plot.line(flights, { x: "day", y: "y2021", stroke: "#E15759" })
]
})
);
})
.catch((err) => err)
FIN
I’ll likely do a more in-depth piece on Plot in the coming weeks (today is Mother’s Dayin the U.S. and that’s going to consume most of my attention today), but I highly encourage y’all to play with this new, fun tool.
One Trackback/Pingback
[…] *** This is a Security Bloggers Network syndicated blog from rud.is authored by hrbrmstr. Read the original post at: https://rud.is/b/2021/05/09/using-the-new-plot-javascript-exploratory-visualization-library-sans-obs… […]