Public
Edited
Dec 30, 2022
Insert cell
Insert cell
Insert cell
## Ability Loss/Gain During Evolution
Insert cell
_.pickBy(lostAbilities, set => set.size > 10)
Insert cell
lostAbilities = {
const lostAbilities = {};
for (const pokemon of pokedexList) {
if (pokemon.prevo) {
const prevo = pokemonByName.get(pokemon.prevo)
for (const ability of Object.values(prevo.abilities)) {
if (!hasAbility(ability, pokemon.name)) {
if (!lostAbilities[ability]) {
lostAbilities[ability] = new Set([prevo.name])
} else {
lostAbilities[ability].add(prevo.name)
}
}
}
}
}
return lostAbilities;
}
Insert cell
_.pickBy(gainedAbilities, set => set.size > 4)
Insert cell
gainedAbilities = {
const gainedAbilities = {}
for (const pokemon of pokedexList) {
if (pokemon.prevo) {
const prevo = pokemonByName.get(pokemon.prevo)
for (const ability of Object.values(pokemon.abilities)) {
if (!hasAbility(ability, prevo.name)) {
if (!gainedAbilities[ability]) {
gainedAbilities[ability] = new Set([pokemon.name])
} else {
gainedAbilities[ability].add(pokemon.name)
}
}
}
}
}
return gainedAbilities
}
Insert cell
## Frequency of Abilities
Insert cell
abilitiesByFrequency = _.groupBy(abilities, ability => abilityCounts[ability])
Insert cell
Insert cell
Object.fromEntries(
types.map((type) => {
return [
type,
abilities.filter((ability) => {
return (
!isSignatureAbility(ability) &&
pokedexList
.filter((mon) => {
return Object.values(mon.abilities).includes(ability);
})
.every((mon) => {
return mon.types.includes(type);
})
);
})
];
})
)
Insert cell
abilities = Object.keys(abilityCounts)
Insert cell
// TODO disambiguate between different formes
abilityCounts = {
const abilityCounts = {}
for (const mon of pokedexList) {
for (const ability of Object.values(mon.abilities)) {
if (!abilityCounts[ability]) {
abilityCounts[ability] = 0
}
abilityCounts[ability] += 1
}
}
return abilityCounts
}
Insert cell
uniqueAbilities = uniqueAbilityMap.map(pair => pair.ability)
Insert cell
// TODO need to also account for abilities shared by an evolution family
uniqueAbilityMap = _.map(abilityCounts, (count, ability) => ({ ability, count }))
.filter(({ count }) => count === 1)
.map(({ ability }) => ({
ability,
pokemon: pokedexList.find((mon) =>
Object.values(mon.abilities).includes(ability)
).name
}))
Insert cell
abilityCountsByType = {
const counts = {}
for (const mon of pokedexList) {
for (const ability of Object.values(mon.abilities)) {
for (const type of mon.types) {
if (!counts[type]) {
counts[type] = {}
}
if (!counts[type][ability]) {
counts[type][ability] = 0
}
counts[type][ability] += 1
}
}
}
return counts
}
Insert cell
sortedAbilities = _.sortBy(Object.entries(abilityCounts), ([name, count]) => count)
Insert cell
mostCommonAbilitiesByType = _.mapValues(abilityCountsByType, counts => {
return _.sortBy(Object.entries(counts), ([name, count]) => -count)
})
Insert cell
abilityTypeTally = _.groupBy(abilities, ability => abilityTypeCounts[ability])
Insert cell
abilityTypeCounts = _.mapValues(abilitiesByTypeCount, types => types.size)
Insert cell
abilitiesByTypeCount = {
const counts = {}
for (const mon of pokedexList) {
for (const ability of Object.values(mon.abilities)) {
if (!counts[ability]) {
counts[ability] = new Set()
}
for (const type of mon.types) {
counts[ability].add(type)
}
}
}
return counts
}
Insert cell
function isSignatureAbility(ability) {
const supportedMons = abilitiesByPokemon[ability]
const mon = supportedMons[0]
// check that every pokemon with the ability is in this pokemon's evolution family
const evoFam = new Set(getEvolutionFamily(mon))
return supportedMons.every(mon => evoFam.has(mon))
}
Insert cell
abilitiesByPokemon = {
const abilities = {}
for (let mon of pokedexList) {
for (let ability of Object.values(mon.abilities)) {
if (!abilities[ability]) {
abilities[ability] = [mon.name]
} else {
abilities[ability].push(mon.name)
}
}
}
return abilities
}
Insert cell
function hasAbility(ability, mon) {
if (!pokemonByName.get(mon)) {
throw new Error("Cannot find ", mon)
}
return Object.values(pokemonByName.get(mon).abilities).includes(ability);
}
Insert cell
// TODO wanna make this a stacked bar chart...
md`
${Object.entries(mostCommonAbilitiesByType).map(([type, list]) => `
## ${type}
${_.take(list, 3).map(([name, count]) => `* ${name}, ${count}`).join('\n')}
`)}
`
Insert cell
import { pokedex, pokedexList, pokemonByName, types, getEvolutionFamily } from "@tesseralis/pokemon-dataviz"
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