Card Performance: Win Rate vs Games Played
Plot.plot({
marginLeft: 70,
marginBottom: 50,
style: {fontSize: "13px"},
x: {label: "Games Played", grid: true, nice: true},
y: {
label: "Game Win Rate",
labelArrow: "none",
domain: yDomain,
tickFormat: ".0%",
grid: true
},
color: {
type: "linear",
scheme: "RdYlGn",
domain: yDomain,
pivot: 0.5,
legend: true,
label: "Win Rate",
tickFormat: ".0%"
},
r: {range: [3, 16]},
marks: [
Plot.ruleY([0.5], {
stroke: "gray", strokeDasharray: "4,4", strokeOpacity: 0.6
}),
Plot.dot(filtered, {
x: "games_played",
y: "game_win_rate",
r: "games_played",
fill: "game_win_rate",
stroke: "white",
strokeWidth: 0.75,
fillOpacity: 0.8,
channels: {Card: "card_name"},
tip: {format: {Card: true, x: ",.0f", y: ".1%", r: false, fill: false}}
})
]
})
Top Performing Cards (20+ Games)
topCards.length === 0
? html`<p class="text-muted">No cards with sufficient games played.</p>`
: html`<div style="display: flex; flex-direction: column; gap: 8px;">
${topCards.map(d => html`
<div style="padding: 10px 14px;
background: var(--bs-tertiary-bg);
border-left: 4px solid var(--bs-success);
border-radius: 5px;">
<div style="font-weight: 600; margin-bottom: 2px;">${d.card_name}</div>
<div>
<span style="font-size: 22px; font-weight: 700; color: var(--bs-success);">
${(d.game_win_rate * 100).toFixed(1)}%
</span>
<span style="font-size: 13px; opacity: 0.7;"> (${d.games_played} games)</span>
</div>
</div>`)}
</div>`
Detailed Card Statistics
Inputs.table(filtered, {
columns: ["season_id", "card_name", "games_won", "games_played", "game_win_rate"],
header: {
season_id: "Season",
card_name: "Card Name",
games_won: "Games Won",
games_played: "Games Played",
game_win_rate: "Game Win Rate"
},
format: {game_win_rate: rateCell},
align: {games_won: "right", games_played: "right", game_win_rate: "right"},
sort: "games_played",
reverse: true,
rows: 20,
layout: "auto"
})