100 Beautiful and Informative Notebooks of 2021
Tags: programming, design, datascience, news
Published: 2021-12-31 10:33:08

It's the end of 2021, and I would like to reminisce about the amazing work that was produced on Observable over the last year. I have taken all the notebooks that were [trending](https://observablehq.com/trending) from the [Top Trending Notebook Twitter Bot](https://twitter.com/trendingnotebo2) and picked 100 good ones.


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/bt6fql1oaz2awrb87cnj.png)

The broad categories apparent in 2021 were "dataviz, art, mathematics, maps, apps, development, design, tutorials and tools". Every notebook listed here is worth a read, but there is rather a lot so it might take you a few sessions!

OK, enough chat... here are my favorite notebooks of 2021, sorted into topics...

## Dataviz

Observable is a digital community for data practitioners. In 2021 an enormous quantity of informative dataviz notebooks were produced, but here is some of the very best. Special shout out to [@karimdouieb](https://observablehq.com/@karimdouieb) who has been on fire using 3D graphics to visualize large datasets with great effect in works like [All the passes](https://observablehq.com/@karimdouieb/all-the-passes).

### [The Sun’s analemma](https://observablehq.com/@fil/the-suns-analemma) by [@fil](https://observablehq.com/@fil) 

[![](https://static.observableusercontent.com/thumbnail/a469dac699631b6c013791f375a8c133e014d567c54884a6e981c38a22fe540b.jpg)](https://observablehq.com/@fil/the-suns-analemma)

If you were to look at the sky every   of the year at the exact same hour, where would the Sun be? The diagram below shows its position for each hour of the day, limited by the horizon. Each twisted loop (called an  analemma), is in fact made of   dots, one for each   of the year. The analemma shows by how much solar time is fast or slow compared to clock time, at different periods of the year. Click on the map to set the observer’s location (defaults to Greenwich).
### [Equal-Area Radial Matrix of LGBT Rights](https://observablehq.com/@kerryrodden/equal-area-radial-matrix-of-lgbt-rights) by [@kerryrodden](https://observablehq.com/@kerryrodden) 

[![](https://static.observableusercontent.com/thumbnail/cc9e9c032662b0e948e7fa4a5ea707e1e9f4e5dc220af2a520185da0fbfe04f0.jpg)](https://observablehq.com/@kerryrodden/equal-area-radial-matrix-of-lgbt-rights)

In Why use a radial data visualization?, I wrote about some of the pros and cons of choosing a radial layout for time series, categorical, or hierarchical data. I left out matrix/heatmap data, though—so for Pride month, here’s a partial re-creation of a radial matrix visualization I love, The Guardian’s Gay rights in the US, state by state (whose scope covers both sexual orientation and gender identity, despite the title).
### [All the passes ⚽️](https://observablehq.com/@karimdouieb/all-the-passes) by [@karimdouieb](https://observablehq.com/@karimdouieb) 

[![](https://static.observableusercontent.com/thumbnail/1f66644982c5ce9839471e840ac302cd0e5dae81e265704b320fb79923fdcce6.jpg)](https://observablehq.com/@karimdouieb/all-the-passes)

A visualisation of 882,536 passes from 890 matches played in various major leagues/cups such as the Champion League 1999 FA Women’s Super League 2018 FIFA World Cup 2018, La Liga 2004 – 2020 NWSL 2018 Premier League 2003 – 2004 Women’s World Cup 2019 Data provided by StatsBomb Original inspiration: Alexander Varlamov's blog post Data Dependencies
### [State of Dataviz](https://observablehq.com/@observablehq/state-of-dataviz-2021) by [@observablehq](https://observablehq.com/@observablehq) 

[![](https://static.observableusercontent.com/thumbnail/9e3d8fa41c5437af5ca47367b917509881fbbde85b4fc0b3afef819fcdbe7a6e.jpg)](https://observablehq.com/@observablehq/state-of-dataviz-2021)

2021 Observations: Data through the lens of the Observable Community One of Observable’s motivating principles is to listen to and learn from its passionate and fast-growing community. Hundreds of our community members generously participated in two research surveys about data analysis and visualization over the past year. Here’s what we learned. Data is exploding, for everyone With the explosive growth in online technologies, services and information, data is overwhelming for all of us.
### [Women in space 👩🏼‍🚀](https://observablehq.com/@ralucanicola/women-in-space) by [@ralucanicola](https://observablehq.com/@ralucanicola) 

[![](https://static.observableusercontent.com/thumbnail/d9434b4c7ab2409f54356e8032c4abcd7c272dc3ca90c934f58cf0742df48a2d.jpg)](https://observablehq.com/@ralucanicola/women-in-space)

Data I parsed the data from the Wikipedia site List of female spacefarers. I manually enhanced the comments section with information from individual Wikipedia profiles of the astronauts and information from the NASA site. Sky image by Max McKinnon on Unsplash.
### [Day 9: Smoke Basin](https://observablehq.com/@visnup/day-9-smoke-basin) by [@visnup](https://observablehq.com/@visnup) 

[![](https://static.observableusercontent.com/thumbnail/3fbc343401f2c48ff4e7aa13b4e82da26047e3e1c3ac15b5cd368dfd74fc3e84.jpg)](https://observablehq.com/@visnup/day-9-smoke-basin)

These caves seem to be lava tubes. Parts are even still volcanically active; small hydrothermal vents release smoke into the caves that slowly settles like rain. – Advent of Code 2021, Day 9 Part 2 Find the three largest basins. Starting from a low point (or really, any point in a basin), breadth-first search out from it visiting all its neighbors and keep going, stopping at any 9s. Use a FIFO queue(https://en.wikipedia.org/wiki/FIFO_(computing_and_electronics) and when it’s exhausted we’re done.
### [EU Fishing Flow](https://observablehq.com/@benjamesdavis/eu-fishing-flow) by [@benjamesdavis](https://observablehq.com/@benjamesdavis) 

[![](https://static.observableusercontent.com/thumbnail/d8189a875cc1c5ec9337d4adee5e346721df4ec2ea2830696a3af9e7338f1a49.jpg)](https://observablehq.com/@benjamesdavis/eu-fishing-flow)

Data Helper Functions Scales Dependancies
### [What story do two decades of weather data tell you?](https://observablehq.com/@analyzer2004/weather-grid) by [@analyzer2004](https://observablehq.com/@analyzer2004) 

[![](https://static.observableusercontent.com/thumbnail/4d11846a14d7c9db4f466fb46f22c20df16a0f6c5ff74669780bc1bb6b67beab.jpg)](https://observablehq.com/@analyzer2004/weather-grid)

What story do two decades of daily weather data tell you? You are about to find out 😊. As usual, I picked these five major cities across 1000 miles of the US West Coast. The top part of the graph contains two stacked column charts. The left one represents the temperature distribution of the current month, and the right one shows weather condition distribution.
### [Visualizing Seasonal Daylight](https://observablehq.com/@dbridges/visualizing-seasonal-daylight) by [@dbridges](https://observablehq.com/@dbridges) 

[![](https://static.observableusercontent.com/thumbnail/1423c51e87dfd3cd1afcd14a0c80830cd0fd3dc1bd1c8edffe8a605e9dc9f053.jpg)](https://observablehq.com/@dbridges/visualizing-seasonal-daylight)

Everyone who lives away from the equator knows how the days lengthen and shorten throughout the year. We hear about the long dark polar winters, and the endlessly looping sun of the polar summer. Many people might be able to toss out the answer to these natural phenomena, "because the Earth is tilted," but in my experience far fewer intuitively grasp the geometries involved.
### [How much warmer? (BBC)](https://observablehq.com/@fil/how-much-warmer-bbc) by [@fil](https://observablehq.com/@fil) 

[![](https://static.observableusercontent.com/thumbnail/ccd72badb737756827b40280db3f31d98f71458579ce4a4184fe9a824d5aae5a.jpg)](https://observablehq.com/@fil/how-much-warmer-bbc)

A recreation, for educational purposes, of this beautiful map by the BBC Visual and Data Journalism team (31 July 2019). You can learn more on the original project in this very detailed and complete write-up by the BBC team. Made with D3 (the original visualization uses THREE.js). See also Matt’s version, which uses a phyllotaxis distribution instead of the original’s rectangular grid.
### [Votes for Women: Suffragette Collage Maker](https://observablehq.com/@oliviafvane/votes-for-women-suffragette-collage-maker) by [@oliviafvane](https://observablehq.com/@oliviafvane) 

[![](https://static.observableusercontent.com/thumbnail/a26c4a0b1f7bfd25dcb304c72cede83f96172aaf62b2c547335d45e09dc7271f.jpg)](https://observablehq.com/@oliviafvane/votes-for-women-suffragette-collage-maker)

Submission for Observable's Women's History Month DataViz Contest. Thank you to Jacob Rus for his help optimising the code. Political movements generate their own “stuff”: the posters from the the 2017 Women's March (and the Pussyhat), the Brexit tea towel, the gilets of the Gilets Jaunes. The same is true when women were fighting for the vote in the 20th Century.
### [2021 Observable Community Recognition](https://observablehq.com/@observablehq/2021-observable-community-recognition/2) by [@observablehq](https://observablehq.com/@observablehq) 

[![](https://static.observableusercontent.com/thumbnail/e61e48479a6bff6b34178cbe5e499110de9229b71f9bfca2cb6fc5287ac9573f.jpg)](https://observablehq.com/@observablehq/2021-observable-community-recognition/2)

Observable is built as a space where those who work with data can come together to explore, analyze, discover and communicate with each other. Working with data and making sense of it is challenging, but with the contributions of you, the community, it is easier than ever to work together to make sense of the world with data. Our community inspires data collaborators around the world to collaborate, share, learn, and teach. Every day our community invents new and creative ways to explore and visualize data.
### [The Most Frequently Used Emoji of 2021](https://observablehq.com/@jenniferdaniel/unicode-emoji-mirror) by [@jenniferdaniel](https://observablehq.com/@jenniferdaniel) 

[![](https://static.observableusercontent.com/thumbnail/14350b8fede0499d46cdaaa74ed6e1d55a16296f714a758d08350976c5b001c9.jpg)](https://observablehq.com/@jenniferdaniel/unicode-emoji-mirror)

92% of the world’s online population use emoji — but which emoji are we using? Well, it appears that reports of Tears of Joy’s death are greatly exaggerated 😂. According to data collected by the Unicode Consortium, the not-for-profit organization responsible for digitizing the world’s languages, Tears of Joy accounts for over 5% of all emoji use (the only other character that comes close is ❤️ and there is a steeeeeep cliff after that). The top ten emoji used worldwide are 😂 ❤️ 🤣 👍 😭 🙏 😘 🥰 😍 😊.
### [Hacking Power BI Charts with Plot](https://observablehq.com/@analyzer2004/plot-powerbi) by [@analyzer2004](https://observablehq.com/@analyzer2004) 

[![](https://static.observableusercontent.com/thumbnail/ede7117f6c60a10e5747f67b4538c860e981ab3c784be2078d5eae91d07ac56d.jpg)](https://observablehq.com/@analyzer2004/plot-powerbi)

Are you a fan of both PowerBI and Observable Plot? Here are some ideas for recreating PowerBI charts with the 🙏almighty Plot🙏!! Waterfall Chart Ribbon Chart It's a variant of Bump Chart which reflects both value and the changes in rank over time. Tornado Chart LineDot Chart Waffle Chart Funnel Chart 🌐ericlo.
### [Lucy mission animation](https://observablehq.com/@theeconomist/lucy-mission-animation) by [@theeconomist](https://observablehq.com/@theeconomist) 

[![](https://static.observableusercontent.com/thumbnail/9bfb3f8fa95658c88e24555e43cb7e127efa84b5899d2b8d2ac0b42cba6cc669.jpg)](https://observablehq.com/@theeconomist/lucy-mission-animation)

This notebook contains the code for generating the animated diagram of <small>NASA</small>’s Lucy probe, which will visit many of the “Trojan asteroids”, a pair of clusters of asteroids at the Lagrange points of Jupiter’s orbit. You can read more about Lucy’s mission and see the complete animation in our article. The visualisation above shows one frame of the animation. Labels were added to the final video in AfterEffects, so this diagram has none.
### [The story of Observable on Twitter](https://observablehq.com/@floatingpurr/observable-twitter-2021) by [@floatingpurr](https://observablehq.com/@floatingpurr) 

[![](https://static.observableusercontent.com/thumbnail/6f3358430fd2eb98acd45ed23b2527007bdc495d1409049cf5d95245764a7739.jpg)](https://observablehq.com/@floatingpurr/observable-twitter-2021)

** Main info** 📝 forked integration notebook: Google Sheets Starter ℹ️ dataset: the Observable twitter activity up to (and updated to) 🗓    (source: Twitter API) 📗 Data are hosted in a Google Sheet and published as a csv file Once Upon a Time... ✨✨✨ 💫 Welcome to the data story of Observable on Twitter. Every story has a beginning... Do you remember this? Back in 2017, that was the first "official" Observable tweet, and it has been liked   times 💙 (as of `2021-07-26`).

---

## Digital and Generative Art
The Observable platform is great for iterating on visuals quickly. In 2021 there were many digital artists producing novel and interesting works, some of my top picks are shown below. Makio135's [Creative Coding](https://observablehq.com/@makio135/creative-coding) tutorial notebook on producing generative art on Observable remains a must-read for aspiring digital artists.

### [Flow fields](https://observablehq.com/@esperanc/flow-fields) by [@esperanc](https://observablehq.com/@esperanc) 

[![](https://static.observableusercontent.com/thumbnail/57a869c5f7d513596f9314038af996a886fb80c35deb4dc33b000d35deb8db08.jpg)](https://observablehq.com/@esperanc/flow-fields)

An attempt to reproduce some of the techniques described in Tyler Hobbs' Flow Fields post. A simple field A more interesting field Curves through the field Position sampling Perlin noise fields Colored Perlin fields The idea here is to set the color of each flow curve to the color picked from a "seed" image.
### [Simplex Stacks](https://observablehq.com/@enjalot/simplex-stacks) by [@enjalot](https://observablehq.com/@enjalot) 

[![](https://static.observableusercontent.com/thumbnail/12be8a6c4b36ea08f39be707e2e410dd15d067284382ee10ff86962dc9d790ee.jpg)](https://observablehq.com/@enjalot/simplex-stacks)

You may have heard of Simplex Noise, you can find many amazing visuals using it on Observable. But have you ever seen a stacked area chart of Simplex noise? This notebook does just that, using Plot to visualize the noise in a number of familiar and unfamiliar ways. Try changing the \`z\` parameter to see the noise in action: The data samples the simplex function primarily along the x axis. Each series in the stack is sampled at a single y value.
### [Procedural Face Exploration](https://observablehq.com/@stringertheory/procedural-face-exploration) by [@stringertheory](https://observablehq.com/@stringertheory) 

[![](https://static.observableusercontent.com/thumbnail/4ae6906c45d5ed36a1a67ec0223930b10110b1c53c58dc8a8c53cc842f6d801a.jpg)](https://observablehq.com/@stringertheory/procedural-face-exploration)

This is a copy, with only very slight modifications, of the excellent Procedural Face Generator written by Amit Patel. I wanted to play around with some of the facial features so I ported it into Observable, but you should check out the original (especially the cool sliders that help understand how changing the parameters will change the face 😍)! It's interesting to explore how the face color, eye shape, and the addition of eyelashes change the way the face looks.
### [Pseudo-Blue Noise](https://observablehq.com/@jobleonard/pseudo-blue-noise) by [@jobleonard](https://observablehq.com/@jobleonard) 

[![](https://static.observableusercontent.com/thumbnail/4ec29900fd05a0ebe1b59672361be6d757b18d454f7f68f64868b2b763f021df.jpg)](https://observablehq.com/@jobleonard/pseudo-blue-noise)

Blue noise is a noise color[1] that is particularly well-suited for image dithering purposes (see also [2][3]). Unfortunately it's also computationally intensive to generate. For example, Bart Wronski mentions that generating a "64×64 wrapping blue noise-like sequence" took "a couple hours on an old MacBook." This was in 2016, but unless dramatic progress has been made in the algorithms to generate blue noise this will not be significantly faster today.
### [D3 Force Along a Path](https://observablehq.com/@mootari/d3-path-force) by [@mootari](https://observablehq.com/@mootari) 

[![](https://static.observableusercontent.com/thumbnail/e98143070073f2faab03bc3e68f1298b77b9e469c002c4ee23024b20c605d15a.jpg)](https://observablehq.com/@mootari/d3-path-force)

Implements a custom force for d3-force which moves nodes along an SVG path. "Track strength" vs "Max step size" At each simulation step ("tick") a node is moved towards its target position on the path. The further a node is from its target, the more distance it will cover during a tick.  
The "Track strength" multiplier (\`strength\` option) gets applied to this distance. A value of \`0.5\` means that the node will cover half the remaining distance towards its target on each tick.
### [Generative Painting](https://observablehq.com/@karimdouieb/generative-painting) by [@karimdouieb](https://observablehq.com/@karimdouieb) 

[![](https://static.observableusercontent.com/thumbnail/56212453698f8654771d8386fe38eaf6addd0b24133a76f1405e49acbd1c92f3.jpg)](https://observablehq.com/@karimdouieb/generative-painting)

This is a recreation of a generative water colour like painting technique described beautifully by Tyler Hobbs during his "How to Hack a Painting" talk in the Strange Loop Conference '17. Also checkout his essay on the same subject on his blog.
### [Building a Parametric Seashell](https://observablehq.com/@bronna/parametric-seashell) by [@bronna](https://observablehq.com/@bronna) 

[![](https://static.observableusercontent.com/thumbnail/3d1a416ecd8eb84db078c219a320bc0577df4a7d41a06b5f74be1682febfe7f0.jpg)](https://observablehq.com/@bronna/parametric-seashell)

The clam and the conch seem to be drastically different creatures. One spends its life burrowing in the sand, staying in one spot to glean nutrients from the water. The other constantly vaults itself around the seafloor to find its next meal. One has a gently curving, sand-colored shell, whereas the other has a shell spiking and spiraling and splaying out in the colors of the sunset. These two species are opposites in many ways, yet the same equation underlies both of their shells.
### [SVG flowers](https://observablehq.com/@daformat/svg-flowers) by [@daformat](https://observablehq.com/@daformat) 

[![](https://static.observableusercontent.com/thumbnail/b6c1fb335483e4581b8012fe6be646b8259eab773aef5c63089740a3e2683214.jpg)](https://observablehq.com/@daformat/svg-flowers)

I stumbled on this tweet by @wks_jp and since spring is coming, I was inspired to create the same kind of floral patterns using svg \`stroke-dasharray\`. There are two patterns that we randomly draw: Variable density dotted path: a \`stroke-dasharray\` is used with a 0 length for the stroke so it becomes rounded to evenly spaced circles when \`stroke-linecap\` which is set to \`round\`. Additionally, using this pattern, the resulting flower may or may not have a solid center drawn.
### [Processing https://10print.org/ (p5.js)](https://observablehq.com/@hellonearthis/processing-https-10print-org-p5-js) by [@hellonearthis](https://observablehq.com/@hellonearthis) 

[![](https://static.observableusercontent.com/thumbnail/2eebfe8a59e969a4c1ab9a15cfe427626223fb961c0bb233b4667c65f04cf202.jpg)](https://observablehq.com/@hellonearthis/processing-https-10print-org-p5-js)

Get started with creative coding. Learn more in the tutorial.
### [What's That Noise?](https://observablehq.com/@ambassadors/whats-that-noise) by [@ambassadors](https://observablehq.com/@ambassadors) 

[![](https://static.observableusercontent.com/thumbnail/d29ad7b7aee4d6324050ed1ddf65bc44ae9c129c2073258048ade4c7091c9696.jpg)](https://observablehq.com/@ambassadors/whats-that-noise)

A closer look at various types of 2D noise and how to massage their output. Move your cursor over a noise field (or click/tap) to update its line. (Note: currently not optimized for narrow screens. If you're on mobile, please switch your phone to landscape.
### [Guided Tour of an Infinite Sphere Grid](https://observablehq.com/@mast4461/guided-tour-of-an-infinite-sphere-grid) by [@mast4461](https://observablehq.com/@mast4461) 

[![](https://static.observableusercontent.com/thumbnail/39cb24c6f01580f928304736d2de4a18772b22bec0ac026c1967144f3575144c.jpg)](https://observablehq.com/@mast4461/guided-tour-of-an-infinite-sphere-grid)

An Exploration of Parameter Space Best viewed in fullscreen landscape mode, if your GPU can handle all the ray marching. Shortcuts: I've split the fragment shader into  small chunks so that I can move the canvas cell next to the chunk I'm working on, to see both the canvas and the code. This would otherwise be difficult when working on GLSL code in the middle of a large cell.
### [Playing with Hilbert](https://observablehq.com/@zekenie/playing-with-hilbert) by [@zekenie](https://observablehq.com/@zekenie) 

[![](https://static.observableusercontent.com/thumbnail/e092e72d048e05d75d080009c01e3ea59f4b16be8cb9e64d24280e0d80662d6a.jpg)](https://observablehq.com/@zekenie/playing-with-hilbert)

Space filling curves are fractals that weave through every point in space. They're useful when you are building a system that needs to<br/><br/>\`<twilight-zone-voice>\`<br />&nbsp;&nbsp;&nbsp;&nbsp;jump dimensions <br/>\`</twilight-zone-voice>\`. Let's say you have a piece of string that represents 1-dimentional space. You could mark that string with a sharpie and represent a point.
### [Raytracing in 40 minutes, the Observable port](https://observablehq.com/@migueldeicaza/raytracing-in-40-minutes-the-observable-port) by [@migueldeicaza](https://observablehq.com/@migueldeicaza) 

[![](https://static.observableusercontent.com/thumbnail/7085dc9def8569f727c8a1bdf1d286ebd97873c185c06cebeb7cf52886cfc717.jpg)](https://observablehq.com/@migueldeicaza/raytracing-in-40-minutes-the-observable-port)

This is an ObservableHQ port of the "Raytracing in 40 minutes" from Peter Shirley, one cute feature is that when you update any of the values of this port, it automatically updates all the renderings as you change the functions and variables in this file. Peter announced that he would be doing a short lecture explaining this on his twitter feed. 3D Vectors and Colors in this notebook are represented as arrays of three values, there is no special data type for it.

---

## Mathematics
There is something about the reactive interactivity of Observable that makes it useful for intuition building. There is an avid group of mathmaticians on Observable producing engaging mathmatical teaching materials. Prof. [McClure
](https://observablehq.com/@mcmcclur) in particular has an [extensive set of notebooks](https://observablehq.com/@mcmcclur?tab=collections) to support his classes.

### [Hilbert Curve Plot](https://observablehq.com/@enjalot/hilbert-curve-plot) by [@enjalot](https://observablehq.com/@enjalot) 

[![](https://static.observableusercontent.com/thumbnail/13398cccab514eaabac6e119598250a2cace03920184a74e2f465b4f4a461eff.jpg)](https://observablehq.com/@enjalot/hilbert-curve-plot)

A simple representation of the Hilbert curve, calculated with d3-hilbert and rendered with Plot. Stacking Plots When you stack several orders of Hilbert curves on top of each other the pattern between orders can be a bit clearer. It helped me to notice the multiples of 4, and how each level "up" creates 4 corners of a box surrounding a point at the level below.
### [Aliasing](https://observablehq.com/@cscheid/aliasing) by [@cscheid](https://observablehq.com/@cscheid) 

[![](https://static.observableusercontent.com/thumbnail/65f42a4b2e30a33ff7803e37d4a5fe04d11fee23e8c52aba4ec92965527dde97.jpg)](https://observablehq.com/@cscheid/aliasing)

This tweet shows the phenomenon of aliasing  through a very effective animation. The notebook port here provides a little bit of interactivity so you can explore what happens when a signal is not sampled often enough in a reconstruction: A well-sampled signal must be sampled at least twice as often as the highest frequency in the original signal. It's not obvious yet always possible to reconstruct a signal exactly if it's been sampled at a sufficiently-high rate.
### [Wrap Your Eye Around Rubik's Cube 👁](https://observablehq.com/@mast4461/wrap-your-eye-around-rubiks-cube) by [@mast4461](https://observablehq.com/@mast4461) 

[![](https://static.observableusercontent.com/thumbnail/d68b9e7296b336229419b7fabd50de1aca0fe6301ec6539fc76ed29ff070d7ee.jpg)](https://observablehq.com/@mast4461/wrap-your-eye-around-rubiks-cube)

Controls: A technique called ray marching is used to render the cube. Usually in ray marching, rays project out from a single point. Here, we don't just project rays in different directions, but we let them start at different points! The graphic below illustrates how the ray origins and ray directions change with the wrap factor. Scroll it to wrap! Implementation Notes to self: Here's a nice example of how to color objects in ray marching: https://www.shadertoy.
### [Density contours with linear binning](https://observablehq.com/@d3/contourdensity-linear-binning) by [@d3](https://observablehq.com/@d3) 

[![](https://static.observableusercontent.com/thumbnail/4acc9d139e55a4784c334094b451c6d92527a06026681d32da66bb0672d9fa23.jpg)](https://observablehq.com/@d3/contourdensity-linear-binning)

new in d3-contour@3 and d3@7! This brownian motion system with   particles is visualized with the contours from d3.contourDensity. The first chart uses the traditional nearest neighbor method; the second chart shows the improved method—linear binning—adopted by d3-contour@3. Density contours are calculated in three stages: first, each of the data points registers its weight onto a grid. The total weights on that grid are then blurred, and contours are computed.
### [Dimensionality Reduction drawings](https://observablehq.com/@saehrimnir/dimensionality-reduction-drawings) by [@saehrimnir](https://observablehq.com/@saehrimnir) 

[![](https://static.observableusercontent.com/thumbnail/403e7296d577d780b11f79d9c90830690c7e40eb5036bfdb42397e2d05f22bcf.jpg)](https://observablehq.com/@saehrimnir/dimensionality-reduction-drawings)

UMAP and t-SNE are iterative dimensionality reduction methods. The picture gets drawn by drawing the voronoi cells of the intermediate results above each other with some opacity.
### [Hexagon grid rounding](https://observablehq.com/@jrus/hexround) by [@jrus](https://observablehq.com/@jrus) 

[![](https://static.observableusercontent.com/thumbnail/3bcbb13ae1247750fd52aaab0fdb5f56fbcd013316fc64b0a660ed1bb1d39857.jpg)](https://observablehq.com/@jrus/hexround)

If we have points in a hexagon grid represented using “axial coordinates” –   and   coordinates aligned with two grid axes oriented 1/6 turn (60°) apart – we can round to the nearest hexagon with the pseudocode below: def axial_round(x, y):
    xgrid = round(x); ygrid = round(y)
    x -= xgrid; y -= ygrid # remainder
    if abs(x) >= abs(y):
        return xgrid + round(x + 0.5*y), ygrid
    else:
        return xgrid, ygrid + round(y + 0.

---

## Maps
Maps are a specialised subset of dataviz dealing with realworld spatial data. Maps are a loved topic on Observable. In 2021 [@floledermann](https://observablehq.com/@floledermann) produced the [projection notebook](https://observablehq.com/@floledermann/projection-playground) to end all projection notebooks.

### [Local Spatial Autocorrelation Interactive Tutorial](https://observablehq.com/@michelleeesi/local-spatial-autocorrelation-interactive-tutorial) by [@michelleeesi](https://observablehq.com/@michelleeesi) 

[![](https://static.observableusercontent.com/thumbnail/e0a6a8a06d73a85c7a86f0cba3bdadab7c036a207243568b9cef301cf8dbfa00.jpg)](https://observablehq.com/@michelleeesi/local-spatial-autocorrelation-interactive-tutorial)

Text in this notebook is adapted from Luc Anselin's GeoDa workbook, available here. GeoDa is a free and open-source program for exploratory spatial data analysis and basic spatial regression modeling that you can download here. When we look at maps, we spot concentrations and groupings of high and low values, start to recognize patterns, and construct stories about what might be going on.
### [Map Projection Playground](https://observablehq.com/@floledermann/projection-playground) by [@floledermann](https://observablehq.com/@floledermann) 

[![](https://static.observableusercontent.com/thumbnail/2a9f315d2dd931acdde2067a6a47d85dc83de17e583b48275856a2e7e69b5702.jpg)](https://observablehq.com/@floledermann/projection-playground)

Adapted for my course "Cartographic and Geodetic Foundations for Planners". You can find even more static examples map projections in this overview. Map Style: ⚠️ This causes rendering errors for some projections: For some interrupted projections, you can set the number of lobes: 1 The circles for visualizing distortions are taken from here.
### [Aires d’accueil des « Gens du voyage »](https://observablehq.com/@visionscarto/aires-d-accueil-les-donnees) by [@visionscarto](https://observablehq.com/@visionscarto) 

[![](https://static.observableusercontent.com/thumbnail/6a4cbb9040229000bebc9108cae1df0ec6b004da7a8ab2d905a02e544d31276e.jpg)](https://observablehq.com/@visionscarto/aires-d-accueil-les-donnees)

Export officiel, par @visionscarto, des données collectées par William Acker dans le cadre de l’inventaire critique publié sous le titre «&nbsp;Où sont les “gens du voyage”&nbsp;?&nbsp;». URL de référence : https://visionscarto.net/aires-d-accueil-les-donnees (Date de mise à jour&nbsp;:  ) \\* Les aires d’accueil sont classées par grandes caractéristiques : aires d’habitat, de petit passage, de grand passage (GP).
### [Five Oceans](https://observablehq.com/@visionscarto/five-oceans-topojson) by [@visionscarto](https://observablehq.com/@visionscarto) 

[![](https://static.observableusercontent.com/thumbnail/d118041b9fd7ee32bb8e3c521172fa86f75d147c2acecfe9552558ec8a40bcfb.jpg)](https://observablehq.com/@visionscarto/five-oceans-topojson)

#30DayMapChallenge — Day 18. Water. Attached to this notebook is a topojson file that I crafted more or less by hand. As I was trying to polish my “Born in Antarctica” notebook, I wasted quite a bit of time in an elusive search for a simple shapefile of the Antarctic Convergence. Unable to find a base map of the Oceans, I decided to create this one and add it to my toolbox.
### [The Earth-Nose-Direction game](https://observablehq.com/@ambassadors/earth-nose-direction-game) by [@ambassadors](https://observablehq.com/@ambassadors) 

[![](https://static.observableusercontent.com/thumbnail/25d9e0fdeea160b358c0982ba95bb7c5325327a98e790b77530a4dd54147e6ef.jpg)](https://observablehq.com/@ambassadors/earth-nose-direction-game)

How many friends can you find? SHARE! https://bit.ly/earth-nose-game code starts below Acknowledgments Notebook developed and edited by: @fil @mootari @radames Thanks for the fantastic feedback/ideas from all our ambassadors friends who almost broke their noses/necks testing the notebook.
### [Getting routes with OSRM](https://observablehq.com/@neocartocnrs/getting-routes-with-osrm) by [@neocartocnrs](https://observablehq.com/@neocartocnrs) 

[![](https://static.observableusercontent.com/thumbnail/5b75c41fabf8ff9f3cef90c26db12c0eac81e8316c4696d56c399a6d6b77722b.jpg)](https://observablehq.com/@neocartocnrs/getting-routes-with-osrm)

The distance between   and   is   km. It takes   hours to cover this distance by car. OSRM (Open Source Routing Machine) is a C++ implementation of a high performance route search engine to obtain the shortest paths in a road network. Available under a simplified BSD license, OSRM is an open source service. See http://project-osrm.org/docs/v5.24.0/api/ Preliminary remarks: To query the OSRM API, you need to have CORS enabled. For that, you can use CORS Anywhere Observable.
### [Latitude and longitude precision](https://observablehq.com/@mourner/latitude-and-longitude-precision) by [@mourner](https://observablehq.com/@mourner) 

[![](https://static.observableusercontent.com/thumbnail/a54a3bbf18eb19ebeae2831ec5644449f6093768a97bab30620461ebebd5e304.jpg)](https://observablehq.com/@mourner/latitude-and-longitude-precision)

How many decimal digits do you need for longitude and latitude? Following the famous XKCD comic on coordinate precision, let's see how this looks on a map. There's a location defined at the bottom of this page, but we've rounded the coordinates to integers, losing all precision. Now it looks like ** ,  **. Where could it originally point to? The map below shows the exact area of all locations that round to these numbers. So, with zero decimal digits, we can place the location somewhere around London.
### [Deriving Pantelleria](https://observablehq.com/@visionscarto/deriving-pantelleria) by [@visionscarto](https://observablehq.com/@visionscarto) 

[![](https://static.observableusercontent.com/thumbnail/2a2769d0eb2a54d83a8ab5daccac267944096c28b53faf251eea3c29baaf7934.jpg)](https://observablehq.com/@visionscarto/deriving-pantelleria)

#30DayMapChallenge — Day 21. Elevation. DEM This notebook starts with a Digital elevation model (DEM) of the Italian island of Pantelleria, halfway between Sicily and the coast of Tunisia in the Mediterranean Sea. I’ve never been there, but it looks like the perfect shape of an island… anyway… let’s begin. I captured this DEM on nextzen’s terrarium. The DEM is   pixels wide by   pixels high. For reference, it corresponds to the following projection (we won’t use it in the notebook).
### [30 days and as many maps](https://observablehq.com/@visionscarto/30-days-and-as-many-maps) by [@visionscarto](https://observablehq.com/@visionscarto) 

[![](https://static.observableusercontent.com/thumbnail/9836403f9d8cffa8257bb3c39b680937b8a841ff4eff8350c4b0229bb9da564d.jpg)](https://observablehq.com/@visionscarto/30-days-and-as-many-maps)

A look back on the #30DayMapChallenge, 2021. Embarking on this challenge at the last minute was a bit stupid, but it felt like an opportunity to finish a few open projects, to try a few ideas, and to showcase a part of my usual toolbox. Day 1. Points. “Dotted Oceans” This globe uses: a backface projection that allows to “see through” the Earth, and a nice-looking random point distribution. Although it’s a very simple notebook, it was quite successful. Day 2. Lines.
### [Download the shape of a country](https://observablehq.com/@severo/download-the-shape-of-a-country) by [@severo](https://observablehq.com/@severo) 

[![](https://static.observableusercontent.com/thumbnail/be6f99630d1a2f6e1eed7bd2711c8ec14c677f3ad8aacbb934ec4c2ae1f8b3fc.jpg)](https://observablehq.com/@severo/download-the-shape-of-a-country)

Select a country (or Antartica) #### Settings You think France is weird? Maybe look at Map Template France Lambert-93 or d3-composite-projections instead. Also, the precision is very bad for small countries. Credits Developed by Sylvain Lesage Data from Natural Earth. Code from Countries by area by Mike Bostock.
### [PHYLLO FORK 🌻🍴 How much warmer? (BBC)](https://observablehq.com/@mattdzugan/phyllo-fork) by [@mattdzugan](https://observablehq.com/@mattdzugan) 

[![](https://static.observableusercontent.com/thumbnail/29fcee9867f39c4ccbee8983f3f40d9247ab0a315049c8e84aa81d1f0f1bfba8.jpg)](https://observablehq.com/@mattdzugan/phyllo-fork)

This is a fork of Fil's notebook. I simply replaced the regular lat/lon grid with a spherical Phyllotaxis sampling. How much warmer? (BBC) A recreation, for educational purposes, of this beautiful map by the BBC Visual and Data Journalism team (31 July 2019). You can learn more on the original project in this very detailed and complete write-up by the BBC team. Made with D3 (the original visualization uses THREE.js).
### [Hello, spatialmerge](https://observablehq.com/@chrispahm/hello-spatialmerge) by [@chrispahm](https://observablehq.com/@chrispahm) 

[![](https://static.observableusercontent.com/thumbnail/cbb5fe4dc750dece7847da10b78803ed909f10f3a8937330dd62c98e5a6e2cd1.jpg)](https://observablehq.com/@chrispahm/hello-spatialmerge)

spatialmerge is a (relatively) fast library for spatial joining and merging data in JavaScript 🚀 This notebook will walk you through different ways to combine spatial datasets. It is a (blatant) copy of the "merging data" tutorial from geopandas, and uses the same underlying datasets. Merging data There are two ways to combine datasets in `spatialmerge` – attribute joins and spatial joins. In an attribute join, a GeoJSON feature collection is combined with an array of objects (e.g.
### [World Grids](https://observablehq.com/@neocartocnrs/world-grids) by [@neocartocnrs](https://observablehq.com/@neocartocnrs) 

[![](https://static.observableusercontent.com/thumbnail/2ddc9257d48669b7e0ae895524775b6ac838e23cde636db9cbbf095f236a1a3c.jpg)](https://observablehq.com/@neocartocnrs/world-grids)

1. Data Import 2. Map Layout ** 3.
### [World Elevation Line Map](https://observablehq.com/@neocartocnrs/world-elevation-line-map) by [@neocartocnrs](https://observablehq.com/@neocartocnrs) 

[![](https://static.observableusercontent.com/thumbnail/3b1d8240d18ba5fe76550304654aaa77e84e83717412580ab43e275e9ebd9be8.jpg)](https://observablehq.com/@neocartocnrs/world-elevation-line-map)

1. Data import. We do... ** 2. Data Handling & stuffs for cartography**. Here, we... 3. Lines ** 3.
### [Macromap](https://observablehq.com/@oliviafvane/macromap) by [@oliviafvane](https://observablehq.com/@oliviafvane) 

[![](https://static.observableusercontent.com/thumbnail/f9d59f68bf77442e7b43bf52c8ebc9003c6f4b0fb3927f334cec91b2972abbe1.jpg)](https://observablehq.com/@oliviafvane/macromap)

An interactive ‘small multiples’ visualisation for historical map collections. How can we get a handle on very large, partially-digitised collections of maps? We need a map of the maps. Macromap is designed to help researchers understand what map sheets the British Ordnance Survey (OS) made, when and where. In addition, it illuminates what’s been digitised: a lot, but not everything.
### [30 Day Map Challenge: Day 8 - Blue](https://observablehq.com/@ambassadors/30-day-map-challenge-day-8-blue) by [@ambassadors](https://observablehq.com/@ambassadors) 

[![](https://static.observableusercontent.com/thumbnail/956abb9cfd1ffb60c36b836aa2948fd60470d81c1ad6f7b828294773e0b0ba54.jpg)](https://observablehq.com/@ambassadors/30-day-map-challenge-day-8-blue)

The Ocean blue This literally took about 15 minutes to build, in spite of the fact that I never used the drop shadow technique before.
### [Let's make an extruded map](https://observablehq.com/@neocartocnrs/lets-make-an-extruded-map) by [@neocartocnrs](https://observablehq.com/@neocartocnrs) 

[![](https://static.observableusercontent.com/thumbnail/e426f26f6aabd5d8038d814e22caa8136492d46283fd5666b7431cf4a428dcba.jpg)](https://observablehq.com/@neocartocnrs/lets-make-an-extruded-map)

1. Data Import & handling **2.
### [Day 11: 3D, 30 Day Map Challenge 2021](https://observablehq.com/@ambassadors/day-11-3d-30-day-map-challenge-2021) by [@ambassadors](https://observablehq.com/@ambassadors) 

[![](https://static.observableusercontent.com/thumbnail/7313dc40a95cabd03eedd33ab341b6942f23e84db264a7563e8b9d0f8b8b74c1.jpg)](https://observablehq.com/@ambassadors/day-11-3d-30-day-map-challenge-2021)

https://data.linz.govt.nz/layer/50768-nz-contours-topo-150k/ This is a little slow load as it needs to extract the data files from a zip file. The contours Shapefile contains two types of geometry types, LineString and MultiLineString The Mouse can interact with the maps orientation. Add colours based on elevation,  there are   zones over a range of   to ✅ The objective here is to convert the contours of Taranaki into a three.js objects. ✅ Fix map orientation.

---

## Apps
At its core, Observable is a front end development platform, and a few of the community have built fully fledged web applications.

### [Sign a PDF and Adobe: Go F* Yourself](https://observablehq.com/@tomlarkworthy/sign-a-pdf) by [@tomlarkworthy](https://observablehq.com/@tomlarkworthy) 

[![](https://static.observableusercontent.com/thumbnail/277ab47fb860bf5f048c4e1e443f0d6fe3232e917c0c0393bcfbab7e527f2e78.jpg)](https://observablehq.com/@tomlarkworthy/sign-a-pdf)

Allows super-imposing an image of your signature on a PDF. ** Note: you can also do this using Mac Preview, see Tools > Annotate > Signature (docs)** Why not use Adobe? I once had a Adobe subscription exactly for this purpose but I was unable to cancel it. So it cost me $200 to sign a document. They are predatory, and its not just me. Why not use the free tools on the internet? I want to sign financial documents and privacy is critical. Unfortunately, I cannot audit most free software on the internet.
### [Morse code trainer](https://observablehq.com/@visnup/morse-code-trainer) by [@visnup](https://observablehq.com/@visnup) 

[![](https://static.observableusercontent.com/thumbnail/5ffabe0327755a1f7a37d1b7727946ebe7151a8261f6013e17c0b012efeb377d.jpg)](https://observablehq.com/@visnup/morse-code-trainer)

Use the button below to practice your Morse code. Sound on 🔊. Once you’ve focused the button by pressing it, you can also use the spacebar. If you’re finding it difficult to encode a dah (a.k.a. dash −), try adjusting the dit (a.k.a. dot ·) duration. Built with <img src="https://avatars0.githubusercontent.com/u/841829?v=4&s=48" style="border-radius: 100%; height: 24px; vertical-align: middle;" /> @tophtucker while streaming.
### [Sequencer](https://observablehq.com/@tomlarkworthy/sequencer) by [@tomlarkworthy](https://observablehq.com/@tomlarkworthy) 

[![](https://static.observableusercontent.com/thumbnail/7be88159176597813f93770c92f90f95c8a1b6b61b3b6440b531deff0f5679a9.jpg)](https://observablehq.com/@tomlarkworthy/sequencer)

The sequence connects to the drum pads which connect to the samples.

---

## Development
Building complex applications on Observable requires all kinds of supporting libraries. A number of development notebooks stood out in 2021. Databases were a strong theme over the year, due to additional SQL support provided by the platform.

### [Interactive exploration with DuckDB: 5.2 million rows of college degrees in the browser](https://observablehq.com/@bmschmidt/duckdb-degrees) by [@bmschmidt](https://observablehq.com/@bmschmidt) 

[![](https://static.observableusercontent.com/thumbnail/330262ce1561fca449e1e263e1230e7a4f8f6b21f76bd0214fbd481f89f1667d.jpg)](https://observablehq.com/@bmschmidt/duckdb-degrees)

I've looked in the past at in-browser analytics of a granular database of college degrees using basic Apache Arrow functions and arquero. This notebook does the same thing using the new duckdb wasm module. At first pass it's a cut above in speed and flexibility, because: It can load from compressed parquet files, which allow it to work with larger datasets, faster; It can often be about 10x faster than equivalent in-browser solutions if the data is more than several thousand rows.
### [Introducing SQL with DuckDB in your browser](https://observablehq.com/@cmudig/introducing-sql-with-duckdb) by [@cmudig](https://observablehq.com/@cmudig) 

[![](https://static.observableusercontent.com/thumbnail/ed9a397387d588d64d00f2206a15abd3d35f2dbfce7d2c8d6413f11ce62d2835.jpg)](https://observablehq.com/@cmudig/introducing-sql-with-duckdb)

SQL is a declarative programming language transforming and querying data. It is declarative, meaning that you specify the data you want and not how the query should be computed. SQL is a great fit for a range of data transformation tasks including filter, sample, aggregation, window, and, join. SQL is the most popular query language for database management systems and essential to many business and data science workflows.
### [Hello, CodeMirror 5!](https://observablehq.com/@mootari/codemirror) by [@mootari](https://observablehq.com/@mootari) 

[![](https://static.observableusercontent.com/thumbnail/7dfb899207a23f128583a14347a8d7fccef12518f2cca5f10756a51c986eca89.jpg)](https://observablehq.com/@mootari/codemirror)

Demo Stuff
### [SQLite](https://observablehq.com/@observablehq/sqlite) by [@observablehq](https://observablehq.com/@observablehq) 

[![](https://static.observableusercontent.com/thumbnail/0f21d64a4700387e9057757954da01347d3af7a183f5c475ba9fc0ce211bd098.jpg)](https://observablehq.com/@observablehq/sqlite)

Observable has built-in support for SQLite, “a small, fast, self-contained, high-reliability, full-featured, SQL database engine” and “the most used database engine in the world.” Observable’s SQLite client uses sql.js, an Emscripten port of SQLite. After attaching a SQLite file to your notebook, create a SQLite database client by calling file.sqlite(). Here we’ll explore the Chinook sample database which represents a music library. You can also call SQLiteDatabaseClient.
### [localStorageView: Non-invasive local persistance](https://observablehq.com/@tomlarkworthy/local-storage-view) by [@tomlarkworthy](https://observablehq.com/@tomlarkworthy) 

[![](https://static.observableusercontent.com/thumbnail/d902f7ddc6c312707deea4a6dc5d852832af34faac643dde5d4a2cbba56922cf.jpg)](https://observablehq.com/@tomlarkworthy/local-storage-view)

Lets make it simple to add local storage to a UI control (e.g. @observablehq/inputs) We exploit back-writability and input binding to avoid having to mess with existing UI control code. localStorageView(key) creates a read/write view of a safe-local-storage. Because it's a view it can be synchronized to any control we want to provide persistence for. We avoid having to write any setItem/getItem imperative wiring. If you want all users to share a networked value, consider shareview.
### [Hacking Observable's new Cell Modes to use SQL](https://observablehq.com/@asg017/hacking-observables-new-cell-modes-to-use-sql) by [@asg017](https://observablehq.com/@asg017) 

[![](https://static.observableusercontent.com/thumbnail/3a85285180eb578a25623e9b4d444998d093ae940c95c6d83777a4ff3eeb5f50.jpg)](https://observablehq.com/@asg017/hacking-observables-new-cell-modes-to-use-sql)

2021-12-01 Update: Rejoice! Observable now has SQL cells as a proper feature.

---

## UI, UX and Web Design
Observble notebooks promote resuse. A number of useful components were developed which can be used in other Dataviz notebooks. [Mathieu Jouhet](https://observablehq.com/@daformat) wrote a stunning library + tutorial notebook on [Rounding polygon corners in SVG](https://observablehq.com/@daformat/rounding-polygon-corners)

### [That colorful font](https://observablehq.com/@kelleyvanevert/that-colorful-font) by [@kelleyvanevert](https://observablehq.com/@kelleyvanevert) 

[![](https://static.observableusercontent.com/thumbnail/719fd5c84183d3a20e1db18064b8fa2971914b8282c9566731f9f8269963de12.jpg)](https://observablehq.com/@kelleyvanevert/that-colorful-font)

That colorful font from the browser extension, What have you made today? This is the original font face, I think: Type With Pride
### [D3 Charts](https://observablehq.com/@d3/charts) by [@d3](https://observablehq.com/@d3) 

[![](https://static.observableusercontent.com/thumbnail/8e02be2cb0444f15fc8b0b621839f74242b5a528df2c291ffa4f72b6f3abd875.jpg)](https://observablehq.com/@d3/charts)

A guide to D3’s reusable example charts D3 Charts help you get started quickly with D3. To use these charts in your application, copy-paste or import the chart function into your code, then pass the chart function your data and any options. The chart function returns an SVG element that you can then insert into the page. The chart functions are designed to work out of the box: the options are all, well… optional, with reasonable defaults.
### [Rounding polygon corners](https://observablehq.com/@daformat/rounding-polygon-corners) by [@daformat](https://observablehq.com/@daformat) 

[![](https://static.observableusercontent.com/thumbnail/4628a4720f261b7186a115be018f5db7edabb786dd0fcd52f2158cbc47bdf56f.jpg)](https://observablehq.com/@daformat/rounding-polygon-corners)

In my previous notebook about how to find the union polygon of overlapping rectangles I've included a polygon corner rounding algorithm as a post-processing step but didn't explain how it worked.
### [Stencil all the things! Distributing circles around a shape](https://observablehq.com/@daformat/distributing-circles-around-a-shape) by [@daformat](https://observablehq.com/@daformat) 

[![](https://static.observableusercontent.com/thumbnail/51248a93bdbf534bd4e9ad0b2a2b327832cdbbe883d6e2487a88c23fa59903e9.jpg)](https://observablehq.com/@daformat/distributing-circles-around-a-shape)

Inspired by a tweet form Chris Gannon, I decided to explore this stencil effect by recreating it in a generative way. Instead of manually placing and colorizing each circle, I wanted to be able to dynamically generate them given any svg path. In this notebook we'll learn how use the svg APIs, sprinkled with some vector math, to randomly distribute shapes along any given path. Let's stencil all the things! Learning how to fish Now, in the end, this effect is pretty simple.
### [Upset Plots with Observable Plot](https://observablehq.com/@spren9er/upset-plots-with-observable-plot) by [@spren9er](https://observablehq.com/@spren9er) 

[![](https://static.observableusercontent.com/thumbnail/713c7c465ce814ed3b0d20e1513b3d1b76d0eca557f6f179fd79b0433cb2989f.jpg)](https://observablehq.com/@spren9er/upset-plots-with-observable-plot)

Venn diagrams can be used for comparing two or three sets. They give you an overview of intersection(s) of sets. However, when you have more than three sets to compare, Venn diagrams are not appropriate anymore. One way of visualizing intersections of multiple sets is an Upset Plot. We don't go into detail of how you read Upset Plots here, you can take a look at the official website or  paper. There are libraries for R (UpSetR) and JavaScript (UpSet.js) available for creating your own Upset Plots.
### [Observable TimeChart](https://observablehq.com/@observablehq/timechart) by [@observablehq](https://observablehq.com/@observablehq) 

[![](https://static.observableusercontent.com/thumbnail/b5c772e23e58a13c935d721ba487648b8c81be0f03530ccdfb126cf439fc5252.jpg)](https://observablehq.com/@observablehq/timechart)

TimeChart is an importable component for visualizing time-series data. It can show many signals time-aligned as space-efficient horizon charts. If you hover over a chart, all charts on the page show the value at that time, aiding interpretation. To use in your notebook: Then, call TimeChart and TimeAxis to create charts as described below. Configuration TimeChart expects a consistent x-axis across plots so that you can see coincident patterns.
### [Interactive BCG Matrix Component](https://observablehq.com/@analyzer2004/bcgmatrix) by [@analyzer2004](https://observablehq.com/@analyzer2004) 

[![](https://static.observableusercontent.com/thumbnail/fdb25174954be8c5ccd49bb8483f8e28c68992fd79002901a68a22be4d6d1a81.jpg)](https://observablehq.com/@analyzer2004/bcgmatrix)

The BCG Matrix (aka Growth-share matrix) provides a strategic view for analyzing business units, products or services by splitting them into four quadrants according to the growth and relative market share: question marks, stars, dogs and cows. Each quadrant has its own set of unique characteristics that represents a certain degree of profitability. This helps companies decide where to focus their resources to generate the most value, as well as where to cut their losses.
### [Control Panel for Observable (Now with better responsiveness)](https://observablehq.com/@analyzer2004/controlpanel-for-observable) by [@analyzer2004](https://observablehq.com/@analyzer2004) 

[![](https://static.observableusercontent.com/thumbnail/8adc3168c8c88792a6db66168cda136141c1564f4e7d7fb87fc79e0f90e1ec14.jpg)](https://observablehq.com/@analyzer2004/controlpanel-for-observable)

Control Panel is a set of components to assist in easily building a compact and neat argument UI for visualizations. This is extremely useful when the chart has a large number of arguments. It allows the user to adjust all the arguments while simultaneously seeing the changes without the need to scroll back and forth.
### [Composing viewofs with the view literal](https://observablehq.com/@tomlarkworthy/view) by [@tomlarkworthy](https://observablehq.com/@tomlarkworthy) 

[![](https://static.observableusercontent.com/thumbnail/596b8adbb62de11b1a6c5bf90a988950554b35dd2b312f85ac64c7a8c535162d.jpg)](https://observablehq.com/@tomlarkworthy/view)

Lets make custom UIs on Observable easy by composing views. We wrap the amazing hypertext literal with a interceptor that looks for key, view arguments. It uses the key to determine what field to map the view's value to in the container. The syntax of a 2 element array is inspired by Object.entries(...). By reusing the hypertext literal you are able to build your custom ui view using HTML, the best abstraction for layout.
### [CSS Variables #1: Basics](https://observablehq.com/@gianordoli/css-variables) by [@gianordoli](https://observablehq.com/@gianordoli) 

[![](https://static.observableusercontent.com/thumbnail/44228e41994d8449ac8b1376efb5647256370038a7b59b4a6ac1168f2979a1a9.jpg)](https://observablehq.com/@gianordoli/css-variables)

CSS variables is a native way of creating ... variables in CSS! Their official name is actually “CSS custom properties” and they have been supported by all modern browsers since at least 2017. Unlike preprocessors variables, CSS custom properties have access to the DOM. A consequence of that, and the greatest advantage of them over preprocessor variables, is the possibility of declaring values that change based on media queries. More on that later.
### [Color Input / Observable Inputs](https://observablehq.com/@observablehq/input-color) by [@observablehq](https://observablehq.com/@observablehq) 

[![](https://static.observableusercontent.com/thumbnail/24d8ffeeb6b5a1efd75656831644307fdfc3e5361d190bc669b63c248fc36ddd.jpg)](https://observablehq.com/@observablehq/input-color)

This input specifies an RGB color as a hexadecimal string `#rrggbb`. The initial value defaults to black (`#000000`) and can be specified with the value option. The color input is currently strict in regards to input: it does not accept any CSS color string. If you’d like greater flexibility, consider using D3 to parse colors and format them as hexadecimal. If you specify the datalist option as an array of hexadecimal color strings, the color picker will show this set of colors for convenient picking.
### [Form Input / Observable Inputs](https://observablehq.com/@observablehq/input-form) by [@observablehq](https://observablehq.com/@observablehq) 

[![](https://static.observableusercontent.com/thumbnail/68d3e7d182f16aeaadbe0831cf32a00d8da6250f024804f17cd07b3c243b92d2.jpg)](https://observablehq.com/@observablehq/input-form)

The form input combines a number of inputs into a single compound input. It’s intended for a more compact display of closely-related inputs, say for a color’s red, green, and blue channels. You can pass either an array of inputs to Inputs.form, as shown above, or a simple object with enumerable properties whose values are inputs. In the latter case, the value of the form input is an object with the same structure whose values are the respective input’s value.
### [Observable Plot: Box](https://observablehq.com/@observablehq/plot-box) by [@observablehq](https://observablehq.com/@observablehq) 

[![](https://static.observableusercontent.com/thumbnail/f37f57de78af71bcdb6d90911938337a924aeed4cfdf79a233ea836dce825a28.jpg)](https://observablehq.com/@observablehq/plot-box)

This notebook demonstrates how to use composite marks (arrays of marks) and transforms to create a box plot using Observable Plot. These functions (boxX and boxY) define a composite mark suitable for a box plot, applying the necessary
statistical transforms. The boxes are grouped by y or x, respectively, if present. This map function returns only outliers, returning NaN for non-outliers (based on the whisker definitions below).
### [Hello, citation-js!](https://observablehq.com/@fheyen/citation-js) by [@fheyen](https://observablehq.com/@fheyen) 

[![](https://static.observableusercontent.com/thumbnail/068376a98b9241c583ee3b18ed4665ca67974c0dc5371482c562e1af1a1ca901.jpg)](https://observablehq.com/@fheyen/citation-js)

github.com/larsgw/citation.js Paste one or more DOIs, or other identifiers into the input textbox and this notebook will display the citation(s) as text and bibtex.
### [Tree Input](https://observablehq.com/@tophtucker/tree-input) by [@tophtucker](https://observablehq.com/@tophtucker) 

[![](https://static.observableusercontent.com/thumbnail/12db56e2a50ce7c786b88a219c2c2833097e7fe2d48ee37b97c1a74a887e9466.jpg)](https://observablehq.com/@tophtucker/tree-input)

Observable has a lovely default tree inspector for hierarchical data: But you can’t select a child and refer to it in code. With this you can: Options: children: accessor; defaults to `d => d.children` name: function returning string or DOM node; defaults to `d => d.
### [Responsive grid](https://observablehq.com/@tomlarkworthy/grid) by [@tomlarkworthy](https://observablehq.com/@tomlarkworthy) 

[![](https://static.observableusercontent.com/thumbnail/64c43c3b27970e5eb239b73d0bd12227bfb67af5ff1dbd6e769706a860f49599.jpg)](https://observablehq.com/@tomlarkworthy/grid)

Place views on responsive grid panels to create mobile friendly composite views quickly. Simple Uniform Coordinates... yet responsive The controls above are for building intuition over the coordinate system and grid parameters. Play with it! (you can instantiate it against your own grids too) Formally, there are n panels which rearrange to suit the screen resolutions. Typically three panels per row for desktop and 1 per row on mobile.
### [Radar Chart](https://observablehq.com/@saneef/radar-chart) by [@saneef](https://observablehq.com/@saneef) 

[![](https://static.observableusercontent.com/thumbnail/9883dabe8ef2cdb892967681177827333dccfccd11455c66c8d2b99cab906664.jpg)](https://observablehq.com/@saneef/radar-chart)

Learning D3.js References Radar chart by Ben Welsh West Coast weather from Seattle to San Diego by Eric Lo Brand Personality Radar Chart by Jacob T.
### [Tooltip (D3 Convention)](https://observablehq.com/@clhenrick/tooltip-d3-convention) by [@clhenrick](https://observablehq.com/@clhenrick) 

[![](https://static.observableusercontent.com/thumbnail/dec4952637a123be4dbc8dedcc0f907c44657ed1cd5d5c59ecd57330c4f863eb.jpg)](https://observablehq.com/@clhenrick/tooltip-d3-convention)

This version of a Tooltip uses the D3JS convention of \`selection.call()\` to register the Tooltip's behavior. This is an improvement on my original version of a Tooltip Component.
### [How to draw an arrow between 2 dots?](https://observablehq.com/@neocartocnrs/arrows) by [@neocartocnrs](https://observablehq.com/@neocartocnrs) 

[![](https://static.observableusercontent.com/thumbnail/67129dcbeb2b9ad0c758b16fa0eca84cb3323140fecfbabf4e1da410c73e9bcf.jpg)](https://observablehq.com/@neocartocnrs/arrows)

undefined
### [Simple pencil + ink pen effect for SVG path using filters](https://observablehq.com/@oliviafvane/simple-pencil-ink-pen-effect-for-svg-path-using-filters) by [@oliviafvane](https://observablehq.com/@oliviafvane) 

[![](https://static.observableusercontent.com/thumbnail/f078084bc101908eec43db4a0566c64f3835b599e1b01b0c4f124699ca045223.jpg)](https://observablehq.com/@oliviafvane/simple-pencil-ink-pen-effect-for-svg-path-using-filters)

<img width="700px" src="https://astrofella.files.wordpress.com/2019/12/mouse.jpg"> "By Quentin Blake" This is a simple way to do a pencil or ink pen effect for an SVG \`\`<path>\`\`, using the \`\`<feTurbulence/>\`\` noise filter. For more pencil effect examples on Observable, have a look at @matthewturk/pencil-effect-filters, and which also simplify and curve the path    @coreygirard/pencil-mercator, @d3/sketchy-earth and @visionscarto/pencil-globe.

---

## Tutorials
The Observable community likes to help others learn. There are tutorial notebooks dedicated to a wide variaty of topics. I write a lot about how to build applications on Observable, and a focus area for me in 2021 was [scaling UI development](https://observablehq.com/@tomlarkworthy/ui-development).

### [Observable pour les géographes](https://observablehq.com/@neocartocnrs/tuto) by [@neocartocnrs](https://observablehq.com/@neocartocnrs) 

[![](https://static.observableusercontent.com/thumbnail/45b400b2de476e49141eb85e54fa8b1537f6cfbc93c5e7c095ea7eb7b340bcb0.jpg)](https://observablehq.com/@neocartocnrs/tuto)

Depuis plus d'un an, je réalise des cartes et des visualisations de données avec Observable. Dans ce carnet, j'essaie d'expliquer ce que j'ai compris et pourquoi je considère que cet environnement est idéal pour créer des cartes. Je vais probablement améliorer ce matériel de présentation au fil du temps. N'hésitez pas à commenter et à suggérer des ajouts/changements. Commençons par une petite présentation introductive (Thanks Reveal.js). Ressources https://towardsdatascience.
### [Analyzing Time Series Data](https://observablehq.com/@observablehq/analyzing-time-series-data) by [@observablehq](https://observablehq.com/@observablehq) 

[![](https://static.observableusercontent.com/thumbnail/51996f42707ec19bf33e84c3bb7b7a36cefc4444ab206f03c947a56b2c8d9828.jpg)](https://observablehq.com/@observablehq/analyzing-time-series-data)

Approaches for working with data that changes over time Many of us work with data that is about time, tracking fluctuations by hour, day, week, month, etc. We need to know what caused a spike or dip, learn why the actuals diverged from the forecast, characterize typical daily, weekly, and seasonal patterns, or see how the correlation between two metrics depends on time.
### [Scaling User Interface Development](https://observablehq.com/@tomlarkworthy/ui-development) by [@tomlarkworthy](https://observablehq.com/@tomlarkworthy) 

[![](https://static.observableusercontent.com/thumbnail/bd72fc4663ce7c4d8ae9edbde0ba848ee67fc48b1efc45f875b8b49f210fa149.jpg)](https://observablehq.com/@tomlarkworthy/ui-development)

Backend development is rapid, and yet... custom user interface development is still a huge timesink. UI development is a project bottleneck. This living document is a growing list of techniques I have learnt trying to overcome the UI development bottleneck. When I create complex applications, I need contextually sensitive user interfaces.
### [Union polygon and area of rectangles (line sweep algorithm)](https://observablehq.com/@daformat/union-polygon-and-area-of-rectangles-line-sweep-algorithm) by [@daformat](https://observablehq.com/@daformat) 

[![](https://static.observableusercontent.com/thumbnail/f9fda5ccf9f74dcd190e79d06fdbffe75b0fdf376669aafd6946dc10d9d00e9f.jpg)](https://observablehq.com/@daformat/union-polygon-and-area-of-rectangles-line-sweep-algorithm)

Given a set of unrotated and potentially overlapping rectangles, we want to compute the total area covered by their union and get their union polygon(s). One way to proceed is to first use a line sweep algorithm in order to subdivide the surface of the rectangles to a set of non-overlaping rectangles covering the same area. In&nbsp;other words, we want the resulting rectangles to be either contiguous or completely separated.
### [How to make a nice scale bar](https://observablehq.com/@jgaffuri/nice-scale-bar) by [@jgaffuri](https://observablehq.com/@jgaffuri) 

[![](https://static.observableusercontent.com/thumbnail/39c045801f34cecac591bfcaf4561fcf9a47c8efecee60dc69bdb416808e1d9f.jpg)](https://observablehq.com/@jgaffuri/nice-scale-bar)

Here are some hints to make a scale bar with nice rounded values and divisions, for a map. Usually, a scale bar has to fit within a rectangular component, with limited dimensions. It is unlikely that the scale bar length corresponds to a nice rounded value (such as 100km) which can be easily divided into other nice values (such as 25km, 50km, 75km). In such case, it is more suitable to shorten a bit the scale bar to a lower length value which makes it nicer (see here for example).
### [Plot for mathematicians](https://observablehq.com/@mcmcclur/plot-for-mathematicians) by [@mcmcclur](https://observablehq.com/@mcmcclur) 

[![](https://static.observableusercontent.com/thumbnail/f8520d72b8f2c5dca2a2ef12d8dff5d275d3652e11f6f0f47dc02c6be202f6c1.jpg)](https://observablehq.com/@mcmcclur/plot-for-mathematicians)

Observable Plot is a free, open-source library from the folks at Observable designed to make it easy to generate many common types of charts for the visualization of data. The documentation is extensive and generally excellent. It's (understandably) focused on its usage with data, though, which obscures how easily it can be used to generate nice mathematical plots. The purpose of this notebook is to illustrate how we might use it to generate simple graphs of functions.

---

## Tools
The Observble community has built some impressive tooling to support data practitioners. The biggest news of the year was the introduction of [Plot](https://observablehq.com/@observablehq/introducing-observable-plot) by the [Observable](https://observablehq.com/@observablehq) team, which allows rapid production of informative charts.

### [Observable Plot](https://observablehq.com/@observablehq/plot) by [@observablehq](https://observablehq.com/@observablehq) 

[![](https://static.observableusercontent.com/thumbnail/64f414fef8a91248865f5759641b0cf537bc87c0aaf57dc368ffe673013eccaa.jpg)](https://observablehq.com/@observablehq/plot)

Observable Plot is a free, open-source JavaScript library to help you quickly visualize tabular data. It has a concise and (hopefully) memorable API to foster fluency — and plenty of examples to learn from and copy-paste. In the spirit of show don’t tell, below is a scatterplot of the height and weight of Olympic athletes (sourced from Matt Riggott), constructed using a dot mark. We assign columns of data (such as weight) to visual properties (such as the dot’s x), and Plot infers the rest.
### [Data Wrangler](https://observablehq.com/@observablehq/data-wrangler) by [@observablehq](https://observablehq.com/@observablehq) 

[![](https://static.observableusercontent.com/thumbnail/c7bdee74b06348e673a39dfe28b048afd195cc8915bc7383471087c6a322553c.jpg)](https://observablehq.com/@observablehq/data-wrangler)

Data wrangling is often a complex and time consuming part of quantitative work.
This (experimental) `Wrangler` function provides an interface to guide code
composition and also display the results. It uses the
Arquero package, a
robust data wrangling library based on the grammar of data manipulation. To get started, import the `Wrangler` function from this notebook: Then, pass your data into the `Wrangler` function, and access the results: As an example, here is an exploration of U.S. protest data
(source).
### [Introducing Observable Plot](https://observablehq.com/@observablehq/introducing-observable-plot) by [@observablehq](https://observablehq.com/@observablehq) 

[![](https://static.observableusercontent.com/thumbnail/1d5b86ef107a61b6cdcac8f4771621a449f7bc98ce327cab1c35d9ec3094a234.jpg)](https://observablehq.com/@observablehq/introducing-observable-plot)

We are thrilled to announce Observable Plot, a new open-source JavaScript library for exploratory data visualization. Observable’s mission is to help everyone make sense of the world with data. To succeed, we need to make visualization easier and faster, both to learn and to practice. Less chore, more joy. We believe people will be more successful finding and communicating insights if they can “use vision to think” instead of wrestling with the intricacies of programming.
### [Summary Table](https://observablehq.com/@observablehq/summary-table) by [@observablehq](https://observablehq.com/@observablehq) 

[![](https://static.observableusercontent.com/thumbnail/003eb167f7e2fc6aa25532f878bb6176ce3cb46c977754aef2bfdad9642117e6.jpg)](https://observablehq.com/@observablehq/summary-table)

Want a quick visual overview of a dataset? To get started, import the new (experimental) `SummaryTable` function from this notebook: Then, pass your data into the `SummaryTable` function. As an example, here is a summary table of the Penguins dataset (described in detail here).
### [Future of Data Work: Collaboration and No Limits](https://observablehq.com/@observablehq/future-of-data-work-collaboration-and-no-limits) by [@observablehq](https://observablehq.com/@observablehq) 

[![](https://static.observableusercontent.com/thumbnail/ef0da55ceedda5d1c9bff7d452ddcc5097ac26524ae3a9fd4015a5d889cd80e2.jpg)](https://observablehq.com/@observablehq/future-of-data-work-collaboration-and-no-limits)

Imagine all the ways that data flows through an organization.  People explore and analyze data.  People ask critical questions of data.  All of these people bring diverse skills when engaging with data - data scientists, data analysts, data engineers, developers, product managers and decision makers. All of these people seek insights from data for decisions toward better business outcomes, but they all use a different set of techniques and tools to do their jobs.
### [Introducing Dataflow, a self-hosted Observable Notebook Editor](https://observablehq.com/@asg017/introducing-dataflow) by [@asg017](https://observablehq.com/@asg017) 

[![](https://static.observableusercontent.com/thumbnail/1416d927846d192b5ce98acedddcdce372a1a38c96a3775d7b54e98d9480e90a.jpg)](https://observablehq.com/@asg017/introducing-dataflow)

Dataflow is a new tool that lets you run, edit, and compile Observable notebooks locally on your own computer, with any text editor you want! If you have ever wanted to save + run Observable notebooks as files on your computer (for easier integration with git), then Dataflow will be very helpful! Quickstart Check out the documentation for more! In Dataflow, Observable notebooks are files on your computer, with a \`.
### [Plot Tooltip](https://observablehq.com/@mkfreeman/plot-tooltip) by [@mkfreeman](https://observablehq.com/@mkfreeman) 

[![](https://static.observableusercontent.com/thumbnail/de7e4276e777465b25562d23a0f10a2a12d5af35665e0a3eb4811b743ba36f96.jpg)](https://observablehq.com/@mkfreeman/plot-tooltip)

Two approaches for easily adding tooltips to your plots Tooltips on all plots Want to add tooltips to all of your plots? Import `plot` from this notebook, then simply set a `title` attribute for any mark in your plot call (note, this apporach only works with `Plot.plot()` calls, not `Plot.MARK().
### [Future of Data Work: Q&A with Mike Bostock](https://observablehq.com/@observablehq/future-of-data-work-q-a-with-mike-bostock) by [@observablehq](https://observablehq.com/@observablehq) 

[![](https://static.observableusercontent.com/thumbnail/3ce3bc5b4e1aa0129e028fe30e13126cfc541ac24173d12e83554e88a6b89214.jpg)](https://observablehq.com/@observablehq/future-of-data-work-q-a-with-mike-bostock)

Mike Bostock has been busy. Our CTO and co-founder is the author of D3.js, an open-source library for data visualization which celebrated its 10th anniversary this year, and Observable Plot, a new library for exploratory visualization that builds on D3. Not to mention designing and developing features for the Observable platform. For this week’s Future of Data Work series, I sat down with Mike for a Q&A about his motivations and how he hopes people work with data in the future.
### [What’s new in Observable Plot (0.2.7)?](https://observablehq.com/@observablehq/whats-new-in-observable-plot-0-2-7) by [@observablehq](https://observablehq.com/@observablehq) 

[![](https://static.observableusercontent.com/thumbnail/a6f3caf2c994ba47438b2c97242a37edc080b6ea9ffc63a1bd73e2fc362ed0c4.jpg)](https://observablehq.com/@observablehq/whats-new-in-observable-plot-0-2-7)

For more on the latest releases, please see our Changelog. Plot now allows you to inspect scales! Rendered plots (either SVG or figure elements) now expose a plot.scale(name) method that returns an object describing the scale in-use, including any materialized defaults. For example, say you made a scatterplot showing the rise of global surface temperature anomaly using a quantile color scale. To retrieve the color scale for this plot, call plot.scale passing in the name “color”.
### [Building a Better Beeswarm](https://observablehq.com/@yurivish/building-a-better-beeswarm) by [@yurivish](https://observablehq.com/@yurivish) 

[![](https://static.observableusercontent.com/thumbnail/e7a1ce187487ba60e18347cf4461a9c8ec2855bc4c50aa2703a2f68ed9c8dccd.jpg)](https://observablehq.com/@yurivish/building-a-better-beeswarm)

Beeswarm plots are a fun, visually pleasing alternative to histograms that can be used when data is sufficiently small and you want to plot every point. This notebook contains an algorithm for accurate beeswarm plots with circles that vary in radius, using a simple implementation of this algorithm by James Trimble. In addition to being faster to compute than a force-directed layout, it has the advantage of improved accuracy since it preserves the precise x position of each data point.
### [G2Plot 2.3.23 Released 🎉](https://observablehq.com/@me-momo/g2plot-2-3-23-released) by [@me-momo](https://observablehq.com/@me-momo) 

[![](https://static.observableusercontent.com/thumbnail/eac6fefc38b7df256dfecd25e1c3188e17f2bef9d98b0a6dbe9f3f6ad8c571e5.jpg)](https://observablehq.com/@me-momo/g2plot-2-3-23-released)

G2Plot is an interactive and responsive charting library based on the grammar of graphics, which enables users to generate high-quality statistical charts through a few lines of code easily. G2 in "G2Plot" means the grammar of graphics and pays homage to ggplot2. What's New in G2Plot 2.3.23 We've added two new plot types: `Facet` and `Violin`, support `localization`, enhance several plots, like `Sunburst`, `Stock`, `Heatmap` and `Box` and so on.
### [Observable + GitHub 💞](https://observablehq.com/@observablehq/observable-github) by [@observablehq](https://observablehq.com/@observablehq) 

[![](https://static.observableusercontent.com/thumbnail/f2bb6043bdab43d40f87f5a2ed01df92047dbb20e5e8ef594accd3846e744abf.jpg)](https://observablehq.com/@observablehq/observable-github)

Visualizing data is more important than ever There are ~56M+ developers on GitHub and growing. As more developers collaborate, complexity increases. It’s easy for technical matters to consume all our attention, but are we asking the right questions? Is this the right data to be looking at? What are we trying to understand? How to we stay focused on insight? On thinking? How do we - all of us - shift our behavior in order to find answers together? Visualizing data is ONE of the ways we find answers together.

---