Public
Edited
May 11
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
legend = () => {
const k = 24;
const arrow = DOM.uid();
return svg`<g font-family=sans-serif font-size=10>
<g transform="translate(-${k * n / 2},-${k * n / 2}) rotate(-45 ${k * n / 2},${k * n / 2})">
<marker id="${arrow.id}" markerHeight=10 markerWidth=10 refX=4 refY=3 orient=auto>
<path d="M0,0L9,3L0,6Z" />
</marker>
${d3.cross(d3.range(n), d3.range(n)).map(([i, j]) => svg`<rect width=${k} height=${k} x=${i * k} y=${(n - 1 - j) * k} fill=${colors[j * n + i]}>
<title>${data.title[0]}${labels[j] && ` (${labels[j]})`}
${data.title[1]}${labels[i] && ` (${labels[i]})`}</title>
</rect>`)}
<line marker-end="${arrow}" x1=0 x2=${n * k} y1=${n * k} y2=${n * k} stroke=black stroke-width=1.5 />
<line marker-end="${arrow}" y2=0 y1=${n * k} stroke=black stroke-width=1.5 />
<text font-weight="bold" dy="0.71em" transform="rotate(90) translate(${n / 2 * k - 5}, 6)" text-anchor="middle">${data.title[0]}</text>
<text font-weight="bold" dy="0.71em" transform="translate(${n / 2 * k + 4},${n * k + 6})" text-anchor="middle">${data.title[1]}</text>
</g>

<g transform="translate(${k * n - 100}, ${k * (n + 1)})">
<rect width=${k} height=${k} fill="#999999"></rect>
<text x=${k + 7} y=${k / 1.5} alignment-baseline="middle">No Data</text>
</g>

</g>`;
}
Insert cell
color = (value) => {
if (!value || isNaN(value[0]) || isNaN(value[1])) return "#999999"; // Explicit NaN handling
let [a, b] = value;
let xVal = x(a); // e.g. race
let yVal = y(b); // e.g. income
console.log("Income raw:", b, "Bin:", y(b));
console.log("Race raw:", a, "Bin:", x(a));
if ([xVal, yVal].some(v => isNaN(v) || v < 0 || v > 2)) return "#999999";
return colors[x(a) * n + y(b)];
}
// color = {
// return value => {
// if (!value || isNaN(value[0]) || isNaN(value[1])) return "#ccc"; // Gray for missing values
// let [a, b] = value;
// return colors[y(b) * n + x(a)];
// }
// }
// return value => {
// if (!value) return "#ccc";
// let [a, b] = value;
// return colors[y(b) + x(a) * n];
// };
// }
Insert cell
Insert cell
Insert cell
Insert cell
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