chart3 = {
const chartdata = platformProcessing();
const svg = d3.create("svg")
.attr("width", width)
.attr("height", height)
.attr("viewBox", [0, 0, width, height])
.attr("style", "max-width: 100%; height: auto; font: 11px sans-serif;");
const radialScale = d3.scaleLinear()
.domain([d3.min(data, d => d.Rank), d3.max(data, d => d.Rank)])
.range([height - margin.bottom * 7, margin.top]);
const ticks = [d3.max(data, d => d.Rank) * 4 / 5, d3.max(data, d => d.Rank) * 3 / 5, d3.max(data, d => d.Rank) * 2 / 5, d3.max(data, d=>d.Rank) * 1 / 5, d3.min(data, d => d.Rank)];
svg.append("g")
.selectAll("circle")
.data(ticks)
.join("circle")
.attr("cx", width/2)
.attr("cy", height/2 )
.attr("fill", "none")
.attr("stroke", "gray")
.attr("stroke-opacity", 0.4)
.attr("r", d => radialScale(d))
svg.append("g")
.selectAll(".ticklabel")
.data(ticks)
.join("text")
.attr("class", "ticklabel")
.attr("x", width / 2 + 5)
.attr("y", d => height / 2 - radialScale(d))
.text(d => d.toString())
function angleToCoordinate(angle, value) {
let x = Math.cos(angle) * radialScale(value);
let y = Math.sin(angle) * radialScale(value);
return {"x": width / 2 + x, "y": height / 2 - y};
}
const axesData = chartdata.map((f, i) => {
let angle = (Math.PI / 2) + (2 * Math.PI * i / chartdata.length);
return {
"name": f.platform_name,
"angle": angle,
"line_coord": angleToCoordinate(angle, 0),
"label_coord": angleToCoordinate(angle, -5)
}
})
svg.append("g")
.selectAll("line")
.data(axesData)
.join("line")
.attr("x1", width / 2)
.attr("y1", height / 2)
.attr("x2", d => d.line_coord.x)
.attr("y2", d => d.line_coord.y)
.attr("stroke", "black")
.attr("stroke-opacity", 0.5)
svg.append("g")
.attr("text-anchor", "middle")
.selectAll(".axislabel")
.data(axesData)
.join("text")
.attr("x", d => d.label_coord.x)
.attr("y", d => d.label_coord.y)
.text(d => d.name);
const line = d3.line()
.x(d => d.x)
.y(d => d.y);
const colors = ["darkorange", "navy"];
function getRankPath(data_point, value){
let coordinates = [];
for (var i = 0; i < chartdata.length; i++){
let angle = (Math.PI / 2) + (2 * Math.PI * i / chartdata.length);
coordinates.push(angleToCoordinate(angle, chartdata[i][value]));
}
return coordinates;
}
svg.append("g")
.selectAll("path")
.data(chartdata)
.join("path")
.datum(d => getRankPath(d, "averageRank"))
.attr("d", line)
.attr("stroke-width", 1)
.attr("stroke", colors[0])
.attr("fill", colors[0])
.attr("stroke-opacity", 1)
.attr("fill-opacity", 0.01)
svg.append("g")
.selectAll("path")
.data(chartdata)
.join("path")
.datum(d => getRankPath(d, "averageScore"))
.attr("d", line)
.attr("stroke-width", 1)
.attr("stroke", colors[1])
.attr("fill", colors[1])
.attr("stroke-opacity", 1)
.attr("fill-opacity", 0.01)
svg.append("circle")
.attr("cx",50)
.attr("cy",50)
.attr("r", 6)
.style("fill", "darkorange")
svg.append("circle")
.attr("cx",50)
.attr("cy",80)
.attr("r", 6)
.style("fill", "navy")
svg.append("text")
.attr("x", 70)
.attr("y", 50)
.text("Average Rank")
.style("font-size", "11px")
.attr("alignment-baseline","middle")
svg.append("text")
.attr("x", 70)
.attr("y", 80)
.text("Average Metascore")
.style("font-size", "11px")
.attr("alignment-baseline","middle")
svg.append("text")
.attr("x", 70)
.attr("y", 90)
.text("(scaled to % of range 94-99)")
.style("font-size", "9px")
.attr("alignment-baseline","middle")
return svg.node();
}