chart = {
const width = 928;
const height = 900;
const state_gap = width/(num_states+3);
const height_gap = 30;
const state_radius = 10;
const x_transform = function(d){
return 30 + d * state_gap;
}
const y_transform = function(d){
return d*50 +height_gap;
}
const makelink = function(d){
return [{ "x":x_transform(d.x), "y":y_transform(d.y)},
{"x":x_transform(d.bestparent), "y":y_transform(d.y-1)}]
}
const svg = d3.create("svg")
.attr("viewBox", [0, 0, width, height])
.attr("width", width)
.attr("height", height)
.attr("style", "max-width: 100%; height: auto;");
svg.append("g")
.selectAll("circle")
.data(idx_arr)
.join("circle")
.attr("cx", d => x_transform(d.x))
.attr("cy", d=> y_transform(d.y))
.attr("r", d => state_radius)
.attr("fill", "#001b42");
const links = link_arr
links.forEach(link => {
link.sourceX = nodes[link.source].x;
link.sourceY = nodes[link.source].y;
link.targetX = nodes[link.target].x;
link.targetY = nodes[link.target].y;
});
link.data(links)
.join(enter => enter.append("line")
.attr("stroke", "#5c6166")
.attr("stroke-width", 2)
.attr("x1", d => d.sourceX)
.attr("y1", d => d.sourceY)
.attr("x2", d => d.targetX)
.attr("y2", d => d.targetY));
return svg.node();
}