From 9f6300bc9fdc1facbca22454a59f906c14a39c78 Mon Sep 17 00:00:00 2001 From: Richard Dern Date: Tue, 2 Dec 2025 11:42:50 +0100 Subject: [PATCH] =?UTF-8?q?Ajoute=20l=E2=80=99=C3=A9tape=2025=20de=20r?= =?UTF-8?q?=C3=A9partition=20des=20minifigs=20par=20genre?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 7 ++++ figures/step25/minifig_gender_share.png | Bin 0 -> 57362 bytes lib/plots/gender_palette.py | 14 +++++++ lib/plots/minifig_character_spans.py | 14 +------ lib/plots/minifig_characters.py | 14 +------ lib/plots/minifig_gender_share.py | 48 ++++++++++++++++++++++++ lib/rebrickable/minifig_characters.py | 33 ++++++++++++++++ scripts/plot_minifig_gender_share.py | 27 +++++++++++++ tests/test_minifig_characters.py | 33 ++++++++++++++++ tests/test_minifig_gender_share_plot.py | 26 +++++++++++++ 10 files changed, 190 insertions(+), 26 deletions(-) create mode 100644 figures/step25/minifig_gender_share.png create mode 100644 lib/plots/gender_palette.py create mode 100644 lib/plots/minifig_gender_share.py create mode 100644 scripts/plot_minifig_gender_share.py create mode 100644 tests/test_minifig_gender_share_plot.py diff --git a/README.md b/README.md index 67c61e2..6f73cba 100644 --- a/README.md +++ b/README.md @@ -254,3 +254,10 @@ Le script lit `data/intermediate/minifigs_by_set.csv` et `data/intermediate/sets 2. `python -m scripts.plot_minifig_character_spans` Le script lit `data/intermediate/minifigs_by_set.csv` et `data/intermediate/sets_enriched.csv`, calcule la première et la dernière année d'apparition pour chaque personnage (hors figurants), sérialise `data/intermediate/minifig_character_spans.csv`, puis trace `figures/step24/minifig_character_spans.png` (barres horizontales des spans). Les barres sont colorées selon le genre issu de `config/known_character_genders.csv`. + +### Étape 25 : répartition des genres des personnages + +1. `source .venv/bin/activate` +2. `python -m scripts.plot_minifig_gender_share` + +Le script lit `data/intermediate/minifigs_by_set.csv`, agrège le nombre de minifigs distinctes par genre (basé sur `config/known_character_genders.csv`), écrit `data/intermediate/minifig_gender_counts.csv`, puis trace `figures/step25/minifig_gender_share.png` (donut indiquant la part des personnages féminins, masculins ou inconnus). diff --git a/figures/step25/minifig_gender_share.png b/figures/step25/minifig_gender_share.png new file mode 100644 index 0000000000000000000000000000000000000000..1bf71ed49fc191df344a9dbbc9ab96e49eb6cfb4 GIT binary patch literal 57362 zcmeAS@N?(olHy`uVBq!ia0y~yU_JoC9Bd2>48N`k%w}LO>_ z%)lTq8-y7>OPi-KFx;>6ba4!+nDgc?dqqg-uj3!h_o}P3usFTnTP`5za)j$fz?;3_ zV^7~Y{c2Tq?Dc=~rEm9^i*TEXuq^q0&)Mqb$^Vu8_udGoom83mXZPiT^Ow!uPoF+L*&}JZWXTejyj?HVEZ=Uq{3cH*ft$(T+vhvQ=Vxj+ zU(H{*aN(pWQ&j%`{yv>sZ->LP^Yi21-~0V$^Z6(9|NmLOWcl*b?((%Not>TQs@eAa z`}KO2UF`n4z47ywCzM}sWS@Dw@|a}$jk_Y@-}>*ZzqkLNz3IizjddHcuCJTx;^y|Q zyr=xtm6Lz|UW?Apon*%3w=w&=-siZL2a8Wn)Ajwe>+{s-)$g`mkIQyre7O76DX+?3 zFPEpjxv}xmB3JIul_x&$T=}~8uI6+5zi+msot3hDxn%N_ZMXA2|Ni^>sA%n+<1)oP z_uor@P-ilD^_6YH?AhAg;`-Cn=hpuuie`Mf0e_O{=(_qn{P1UFkoZeFLQ zrFG`0R<3f*VsYLtKmR;zmse3&KVBpENxXLb^~a9)f6u;D|L?PW<=hyGsl6l$fUgdMypZ|Wp|6BLJVZT5_;Oc(+e>Z$)UW^V4oAz_T>Tq7uBd=z^ zIBR}iCx8FnvblR#*jK+=xqO!PWBolJntCJ*o93}MwVZpUp`~TC*eAa3=hDi#(a(Dm zc3)tlKIgT~D7sKYf_rKIh*W<=LmF z=^86WoX?+M^U3po%=GDTRVzzgUUI!x`#p9u+YZeaYuI1!_<{>L_PNYe z-~8jpk5&8m$M1K$eG`w*G)|v2(Lnvu1MeSS z=d#7c8m}(7o3lP{@2oeqdsk-6=H}v>_4L2h?>C#D=GXt8{pZVN|7XSb729Pl>HOCZ zkndqw?AT}fE#l?9y}N&Y*5Cgp=<73v1GV4Y-Ob+j>XyZUwI$Q0=rIQ@pHtLz_iW?* z^Z8xHF?Sz5dX#c&OXjol{8>#mzRGvE>xTMddZjnKd$fpm%7aFwe*BOuh&vf+~sSp)T~#VIdf*(sjchE zUtL=}`^d3lvsPxxT9r(A+;1Oe_y5o5s

!zg`VLE3)a@+Gy{Hh#8WNTd%#Z`Fz&= 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 literal 0 HcmV?d00001 diff --git a/lib/plots/gender_palette.py b/lib/plots/gender_palette.py new file mode 100644 index 0000000..1003b52 --- /dev/null +++ b/lib/plots/gender_palette.py @@ -0,0 +1,14 @@ +"""Palette de couleurs et libellés pour les genres des personnages.""" + +GENDER_COLORS = { + "male": "#4c72b0", + "female": "#c44e52", + "unknown": "#7f7f7f", +} + +GENDER_LABELS = { + "male": "Homme", + "female": "Femme", + "unknown": "Inconnu", + "": "Inconnu", +} diff --git a/lib/plots/minifig_character_spans.py b/lib/plots/minifig_character_spans.py index fdf9608..4f72df7 100644 --- a/lib/plots/minifig_character_spans.py +++ b/lib/plots/minifig_character_spans.py @@ -8,22 +8,10 @@ from matplotlib.patches import Patch from lib.filesystem import ensure_parent_dir from lib.milestones import load_milestones +from lib.plots.gender_palette import GENDER_COLORS, GENDER_LABELS from lib.rebrickable.stats import read_rows -GENDER_COLORS = { - "male": "#4c72b0", - "female": "#c44e52", - "unknown": "#7f7f7f", -} -GENDER_LABELS = { - "male": "Homme", - "female": "Femme", - "unknown": "Inconnu", - "": "Inconnu", -} - - def load_spans(path: Path) -> List[dict]: """Charge le CSV des bornes min/max par personnage.""" return read_rows(path) diff --git a/lib/plots/minifig_characters.py b/lib/plots/minifig_characters.py index 3cd0f9f..c98872d 100644 --- a/lib/plots/minifig_characters.py +++ b/lib/plots/minifig_characters.py @@ -7,22 +7,10 @@ import matplotlib.pyplot as plt from matplotlib.patches import Patch from lib.filesystem import ensure_parent_dir +from lib.plots.gender_palette import GENDER_COLORS, GENDER_LABELS from lib.rebrickable.stats import read_rows -GENDER_COLORS = { - "male": "#4c72b0", - "female": "#c44e52", - "unknown": "#7f7f7f", -} -GENDER_LABELS = { - "male": "Homme", - "female": "Femme", - "unknown": "Inconnu", - "": "Inconnu", -} - - def load_counts(path: Path) -> List[dict]: """Charge le CSV des comptes par personnage.""" return read_rows(path) diff --git a/lib/plots/minifig_gender_share.py b/lib/plots/minifig_gender_share.py new file mode 100644 index 0000000..20c2d92 --- /dev/null +++ b/lib/plots/minifig_gender_share.py @@ -0,0 +1,48 @@ +"""Diagramme de répartition des minifigs par genre.""" + +from pathlib import Path +from typing import List + +import matplotlib.pyplot as plt + +from lib.filesystem import ensure_parent_dir +from lib.plots.gender_palette import GENDER_COLORS, GENDER_LABELS +from lib.rebrickable.stats import read_rows + + +def load_gender_counts(path: Path) -> List[dict]: + """Charge le CSV des comptes par genre.""" + return read_rows(path) + + +def plot_minifig_gender_share(counts_path: Path, destination_path: Path) -> None: + """Trace un diagramme circulaire de la répartition des minifigs par genre.""" + rows = load_gender_counts(counts_path) + if not rows: + return + genders = [row["gender"] for row in rows] + counts = [int(row["minifig_count"]) for row in rows] + colors = [GENDER_COLORS.get(gender.strip().lower(), GENDER_COLORS["unknown"]) for gender in genders] + total = sum(counts) + labels = [] + for gender, count in zip(genders, counts): + percent = (count / total) * 100 if total else 0 + label = f"{GENDER_LABELS.get(gender.strip().lower(), 'Inconnu')} ({percent:.1f} %)" + labels.append(label) + + fig, ax = plt.subplots(figsize=(6, 6)) + ax.pie( + counts, + labels=labels, + colors=colors, + startangle=90, + wedgeprops={"linewidth": 0.6, "edgecolor": "#0d0d0d"}, + ) + centre_circle = plt.Circle((0, 0), 0.5, fc="white") + ax.add_artist(centre_circle) + ax.set_title("Répartition des minifigs par genre (thèmes filtrés)") + + ensure_parent_dir(destination_path) + fig.tight_layout() + fig.savefig(destination_path, dpi=160) + plt.close(fig) diff --git a/lib/rebrickable/minifig_characters.py b/lib/rebrickable/minifig_characters.py index 4fae13e..c03f9b0 100644 --- a/lib/rebrickable/minifig_characters.py +++ b/lib/rebrickable/minifig_characters.py @@ -34,6 +34,28 @@ def aggregate_by_character(rows: Iterable[dict]) -> List[dict]: return aggregates +def aggregate_by_gender(rows: Iterable[dict]) -> List[dict]: + """Compte les minifigs distinctes par genre (fig_num unique).""" + genders_by_fig: Dict[str, str] = {} + counts: Dict[str, int] = defaultdict(int) + for row in rows: + fig_num = row["fig_num"].strip() + gender = row.get("gender", "").strip().lower() + normalized = gender if gender in ("male", "female") else "unknown" + if fig_num == "": + continue + if fig_num in genders_by_fig: + continue + genders_by_fig[fig_num] = normalized + counts[normalized] += 1 + aggregates: List[dict] = [] + ordered = ["female", "male", "unknown"] + for gender in ordered: + if gender in counts: + aggregates.append({"gender": gender, "minifig_count": str(counts[gender])}) + return aggregates + + def write_character_counts(path: Path, rows: Sequence[dict]) -> None: """Écrit le CSV des comptes par personnage.""" ensure_parent_dir(path) @@ -45,6 +67,17 @@ def write_character_counts(path: Path, rows: Sequence[dict]) -> None: writer.writerow(row) +def write_gender_counts(path: Path, rows: Sequence[dict]) -> None: + """Écrit le CSV des comptes par genre.""" + ensure_parent_dir(path) + fieldnames = ["gender", "minifig_count"] + with path.open("w", newline="") as csv_file: + writer = csv.DictWriter(csv_file, fieldnames=fieldnames) + writer.writeheader() + for row in rows: + writer.writerow(row) + + def load_sets_enriched(path: Path) -> Dict[str, str]: """Indexe les années par set_num.""" lookup: Dict[str, str] = {} diff --git a/scripts/plot_minifig_gender_share.py b/scripts/plot_minifig_gender_share.py new file mode 100644 index 0000000..c2f5e28 --- /dev/null +++ b/scripts/plot_minifig_gender_share.py @@ -0,0 +1,27 @@ +"""Trace la répartition des minifigs par genre.""" + +from pathlib import Path + +from lib.plots.minifig_gender_share import plot_minifig_gender_share +from lib.rebrickable.minifig_characters import ( + aggregate_by_gender, + load_minifigs_by_set, + write_gender_counts, +) + + +MINIFIGS_BY_SET_PATH = Path("data/intermediate/minifigs_by_set.csv") +GENDER_COUNTS_PATH = Path("data/intermediate/minifig_gender_counts.csv") +DESTINATION_PATH = Path("figures/step25/minifig_gender_share.png") + + +def main() -> None: + """Construit le CSV de répartition par genre et trace le graphique.""" + rows = load_minifigs_by_set(MINIFIGS_BY_SET_PATH) + aggregates = aggregate_by_gender(rows) + write_gender_counts(GENDER_COUNTS_PATH, aggregates) + plot_minifig_gender_share(GENDER_COUNTS_PATH, DESTINATION_PATH) + + +if __name__ == "__main__": + main() diff --git a/tests/test_minifig_characters.py b/tests/test_minifig_characters.py index 1f80b26..817030a 100644 --- a/tests/test_minifig_characters.py +++ b/tests/test_minifig_characters.py @@ -4,10 +4,12 @@ from pathlib import Path from lib.rebrickable.minifig_characters import ( aggregate_by_character, + aggregate_by_gender, aggregate_character_spans, aggregate_presence_by_year, load_sets_enriched, write_character_counts, + write_gender_counts, ) @@ -66,6 +68,24 @@ def test_aggregate_by_character_counts_unique_figs() -> None: ] +def test_aggregate_by_gender_counts_unique_figs() -> None: + """Compter les minifigs distinctes par genre.""" + aggregates = aggregate_by_gender( + [ + {"fig_num": "fig-a", "gender": "male"}, + {"fig_num": "fig-a", "gender": "male"}, + {"fig_num": "fig-b", "gender": "female"}, + {"fig_num": "fig-c", "gender": ""}, + ] + ) + + assert aggregates == [ + {"gender": "female", "minifig_count": "1"}, + {"gender": "male", "minifig_count": "1"}, + {"gender": "unknown", "minifig_count": "1"}, + ] + + def test_write_character_counts_outputs_csv(tmp_path: Path) -> None: """Écrit le CSV des comptes par personnage.""" destination = tmp_path / "counts.csv" @@ -79,6 +99,19 @@ def test_write_character_counts_outputs_csv(tmp_path: Path) -> None: assert destination.read_text() == "known_character,gender,minifig_count\nA,male,2\nB,female,1\n" +def test_write_gender_counts_outputs_csv(tmp_path: Path) -> None: + """Écrit le CSV des comptes par genre.""" + destination = tmp_path / "gender_counts.csv" + rows = [ + {"gender": "male", "minifig_count": "2"}, + {"gender": "female", "minifig_count": "1"}, + ] + + write_gender_counts(destination, rows) + + assert destination.read_text() == "gender,minifig_count\nmale,2\nfemale,1\n" + + def test_aggregate_presence_by_year_excludes_figurants(tmp_path: Path) -> None: """Calcule le total annuel en excluant les figurants.""" sets_path = tmp_path / "sets_enriched.csv" diff --git a/tests/test_minifig_gender_share_plot.py b/tests/test_minifig_gender_share_plot.py new file mode 100644 index 0000000..2f37f23 --- /dev/null +++ b/tests/test_minifig_gender_share_plot.py @@ -0,0 +1,26 @@ +"""Tests du diagramme de répartition des genres.""" + +import matplotlib +from pathlib import Path + +from lib.plots.minifig_gender_share import plot_minifig_gender_share + + +matplotlib.use("Agg") + + +def test_plot_minifig_gender_share(tmp_path: Path) -> None: + """Génère le graphique de répartition par genre.""" + counts_path = tmp_path / "gender_counts.csv" + destination = tmp_path / "figures" / "step25" / "minifig_gender_share.png" + counts_path.write_text( + "gender,minifig_count\n" + "male,2\n" + "female,1\n" + "unknown,1\n" + ) + + plot_minifig_gender_share(counts_path, destination) + + assert destination.exists() + assert destination.stat().st_size > 0