How to build SVG radar charts from player statistics
Neste tutorial criaremos graficos radar em SVG puro para comparar jogadores visualmente. Sem bibliotecas externas.
In this tutorial we'll build pure SVG radar charts to visually compare players. No external libraries.
Precisamos de estatisticas de cada jogador usando o endpoint /players:
const API_KEY = 'YOUR_API_KEY';
const BASE = 'https://football.api.insyde.one';
async function getPlayer(id, season) {
const res = await fetch(`${BASE}/players?id=${id}&season=${season}&key=${API_KEY}`);
const data = await res.json();
return data.response[0];
}
// Memphis Depay, Pedro, Estevao
const players = await Promise.all([
getPlayer(1100, 2025),
getPlayer(47381, 2025),
getPlayer(410116, 2025)
]);
Os eixos do radar precisam de valores entre 0 e 1. Normalizamos dividindo pelo valor maximo possivel ou pelo maximo do dataset.
const AXES = ['Goals', 'Assists', 'Key Passes', 'Dribbles', 'Tackles', 'Rating'];
function normalize(player) {
const s = player.statistics[0];
return {
name: player.player.name,
values: [
s.goals.total / 25, // max ~25 goals
s.goals.assists / 15, // max ~15 assists
s.passes.key / 60, // max ~60 key passes
s.dribbles.success / 80, // max ~80 dribbles
s.tackles.total / 60, // max ~60 tackles
(s.games.rating - 6) / 2 // rating 6-8 mapped to 0-1
]
};
}
function drawRadar(players, svgEl) {
const cx = 200, cy = 200, r = 150;
const n = AXES.length;
let svg = '';
// Grid rings at 20%, 40%, 60%, 80%, 100%
[0.2, 0.4, 0.6, 0.8, 1.0].forEach(s => {
const pts = [];
for (let i = 0; i < n; i++) {
const a = (Math.PI * 2 * i / n) - Math.PI / 2;
pts.push(`${cx + Math.cos(a) * r * s},${cy + Math.sin(a) * r * s}`);
}
svg += `<polygon points="${pts.join(' ')}" fill="none" stroke="#2a2a2a"/>`;
});
// Player polygons
players.forEach(p => {
const pts = p.values.map((v, i) => {
const a = (Math.PI * 2 * i / n) - Math.PI / 2;
return `${cx + Math.cos(a) * r * v},${cy + Math.sin(a) * r * v}`;
}).join(' ');
svg += `<polygon points="${pts}" fill="${p.color}22" stroke="${p.color}" stroke-width="2"/>`;
});
svgEl.innerHTML = svg;
}
onclick nos itens da legenda para alternar a visibilidade de cada jogador com display:none no poligono.
onclick to legend items to toggle each player's polygon visibility.
/players?id=X&season=Y