Public
Edited
Oct 4, 2023
1 fork
Insert cell
Insert cell
chart = {
const svg = d3
.create("svg")
.attr("width", chart_width)
.attr("height", chart_height)
.attr("viewBox", [0, 0, chart_width, chart_height]);

svg
.append("g")
.attr(
"transform",
`translate(0,${chart_height - margin.bottom - margin.top})`
)
.call(d3.axisBottom(x));

svg
.append("g")
.attr("transform", `translate(${margin.left},0)`)
.call(d3.axisLeft(y));

svg
.selectAll(".rect")
.data(data)
.enter()
.append("rect")
.attr("x", margin.left)
.attr("y", (d) => y(d.country) + y_group(d.gender))
.attr("width", (d) => x(+d.n) - margin.left)
.attr("height", y.bandwidth() / 3)
.attr("fill", (d) => fill_scale(d.gender));

return svg.node();
}
Insert cell
x(+"0")
Insert cell
chart_width = 800
Insert cell
chart_height = 1000
Insert cell
margin = ({ left: 40, top: 10, right: 10, bottom: 20 })
Insert cell
fill_scale = d3
.scaleOrdinal()
.domain(new Set(data.map((d) => d.gender)))
.range(["#E74F2A", "#259299", "#48336A"])
Insert cell
y = d3
.scaleBand()
.domain(new Set(data.map((d) => d.country)))
.range([margin.top, chart_height - margin.bottom])
.paddingOuter(0.1)
.paddingInner(0.1)
Insert cell
y_group = d3
.scaleBand()
.domain(new Set(data.map((d) => d.gender)))
.range([0, y.bandwidth()])
Insert cell
x = d3
.scaleLinear()
.domain([0, d3.max(data, (d) => +d.n)])
.range([margin.left, chart_width - margin.right])
Insert cell
xAxis = (g) =>
g
.attr(
"transform",
`translate(0,${chart_height - margin.bottom - margin.height})`
)
.call(d3.axisBottom(x))
Insert cell
yAxis = (g) => g.call(d3.axisLeft(y))
Insert cell
data_raw = FileAttachment("street_names.csv").csv()
Insert cell
data = data_raw.sort((a, b) => d3.descending(+a.n, +b.n))
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