Skip to content

Observable Plot Export Format

The Observable Plot exporter creates scale definitions for use with Observable Plot and D3 visualizations.

PropertyValue
Identifierobservable
Extension.json
Use caseObservable notebooks, D3 visualizations

The output is a JSON object defining a color scale:

{
"type": "linear",
"domain": [0, 255],
"range": ["#440154", "#482878", "#3e4989", "#31688e", "#26828e", "#1f9e89", "#35b779", "#6ece58", "#b5de2b", "#fde725"],
"interpolate": "d3.interpolateRgb"
}
Terminal window
# Basic export
palettize create viridis --format observable --output scale.json --domain 0,100
# Diverging scale
palettize create RdBu -f observable -o diverging.json --domain -10,10 \
-O type=diverging -O pivot=0
# Custom number of colors
palettize create viridis -f observable -o scale.json --domain 0,100 --steps 5
from palettize import create_colormap, get_scaler_by_name, get_exporter
import json
cmap = create_colormap(preset="viridis")
scaler = get_scaler_by_name("linear", domain_min=0, domain_max=100)
exporter = get_exporter("observable")
output = exporter.export(
colormap=cmap,
scaler=scaler,
domain_min=0,
domain_max=100,
options={
"num_colors": 10,
"scale_type": "linear"
}
)
scale_def = json.loads(output)
OptionTypeDefaultDescription
num_colorsintNumber of colors in the range
scale_typestrScale type passed from CLI
typestr"linear"Observable scale type: "linear", "pow", "sqrt", "log", "symlog", "diverging"
pivotfloatPivot point for diverging scales
symmetricboolWhether diverging scale is symmetric

Standard linear interpolation:

Terminal window
palettize create viridis -f observable -o scale.json --domain 0,100

For data with a meaningful midpoint:

Terminal window
palettize create RdBu -f observable -o scale.json --domain -50,50 \
-O type=diverging -O pivot=0

For data spanning orders of magnitude:

Terminal window
palettize create viridis -f observable -o scale.json --domain 1,1000 \
--scale log -O type=log

For count data:

Terminal window
palettize create viridis -f observable -o scale.json --domain 0,100 \
--scale sqrt -O type=sqrt
// Import or paste the scale definition
const scaleConfig = {
"type": "linear",
"domain": [0, 100],
"range": ["#440154", "#21918c", "#fde725"],
"interpolate": "d3.interpolateRgb"
};
// Use with Plot
Plot.plot({
color: {
type: scaleConfig.type,
domain: scaleConfig.domain,
range: scaleConfig.range
},
marks: [
Plot.dot(data, {x: "x", y: "y", fill: "value"})
]
})
import * as d3 from "d3";
const scaleConfig = {
"type": "linear",
"domain": [0, 100],
"range": ["#440154", "#21918c", "#fde725"]
};
const colorScale = d3.scaleLinear()
.domain(d3.quantize(d3.interpolateNumber(scaleConfig.domain[0], scaleConfig.domain[1]), scaleConfig.range.length))
.range(scaleConfig.range);
// Use it
const color = colorScale(50); // Returns interpolated color
Plot.plot({
color: {
type: "linear",
domain: [0, 100],
range: ["#440154", "#482878", "#3e4989", "#31688e", "#26828e", "#1f9e89", "#35b779", "#6ece58", "#b5de2b", "#fde725"]
},
marks: [
Plot.cell(data, {x: "x", y: "y", fill: "value"})
]
})

The exporter maps Palettize interpolation spaces to D3 interpolators:

Palettize SpaceD3 Interpolator
srgbd3.interpolateRgb
labd3.interpolateLab
hcl, oklchd3.interpolateHcl

This ensures color blending in Observable matches the interpolation space used in Palettize.