Marcel0123 commited on
Commit
92f88c1
·
verified ·
1 Parent(s): 2b5f33e

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +41 -48
app.py CHANGED
@@ -1,4 +1,4 @@
1
- # app.py — Titanic Data Adventure (wit thema, vaste layout, uitgebreide intro naast foto)
2
  import gradio as gr
3
  import pandas as pd
4
  import numpy as np
@@ -76,13 +76,32 @@ def make_plot(fig, title):
76
  )
77
  return fig
78
 
79
- def plot_overleving_per_klasse(dfx):
80
- f = px.bar(
81
- dfx, x="pclass", color="status", barmode="group",
82
- category_orders={"pclass":[1,2,3]},
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
83
  color_discrete_map={"Overleefd":"#1B4B91","Niet overleefd":"#A3B1C6"},
 
84
  )
85
- return make_plot(f, "Overleving per klasse")
 
 
86
 
87
  def plot_leeftijdsverdeling(dfx):
88
  f = px.histogram(
@@ -164,7 +183,7 @@ Je voelt de houten reling koud onder je hand. {ending}
164
  return story
165
 
166
  # =========================
167
- # Introductietekst (uitgebreid, modern paneel)
168
  # =========================
169
  INTRO_MD = """
170
  # 🛳️ Titanic Data Adventure
@@ -177,48 +196,21 @@ Meer dan een eeuw later kijken wij mee — niet met verrekijkers of logboeken, m
177
 
178
  ---
179
 
180
- ## Waarom deze data ertoe doet
181
- - **Patronen ontrafelen**: cijfers tonen structuur in chaos — welke groepen hadden toegang tot reddingsboten, wie bevond zich waar, en wat betekende dat?
182
- - **Mens achter het datapunt**: elke rij is iemands dag, iemands kans, iemands lot.
183
- - **Leren van geschiedenis**: ongelijkheid, beslissingen en beperkte middelen — thema’s die vandaag nog steeds resoneren.
184
-
185
- ---
186
-
187
  ## Wat je in dit dashboard gaat zien
188
- 1. **Kerncijfers** Hoeveel passagiers, hoeveel overlevenden, en hoe die verdeeld waren over de **klassen**.
189
- 2. **Verdelingen** Leeftijd, geslacht, ticketprijs (*fare*), familieomvang.
190
- 3. **Verbanden** Overleving t.o.v. klasse en geslacht; prijsverschillen per klasse; samenhang tussen variabelen.
191
- 4. **Machine learning** Een model dat, op basis van historische patronen, jouw **persoonlijke overlevingskans** inschat.
192
- 5. **Jouw scenario** Voer je kenmerken in en lees een korte scene die je terugplaatst op het dek, die nacht.
193
-
194
- ---
195
-
196
- ## De sociologie van de dekken
197
- - **Klasse** was letterlijk een **fysieke laag** aan boord: 1e klasse hoger en centraler, 3e klasse dieper in het schip.
198
- - **Toegang** tot informatie, bemanning en reddingsmiddelen verschilde per dek.
199
- - **Normen & regels** (“**women and children first**”) werden niet overal gelijk toegepast; context en chaos bepaalden veel.
200
-
201
- ---
202
-
203
- ## Hoe lees je de grafieken?
204
- - **Overleving per klasse**: staafdiagram dat laat zien hoe kans ongelijk verdeeld was.
205
- - **Leeftijdsverdeling**: overlappende histogrammen; kijk waar de bulten liggen voor *Overleefd* vs. *Niet overleefd*.
206
- - **Geslachtsverdeling**: cirkelgrafiek; benadrukt het effect van sociale normen.
207
- - **Fare per klasse**: boxplot; toont spreiding en uitschieters — rijkdom was geen garantie, maar wel een voordeel.
208
 
209
  ---
210
 
211
  ## Wat een model wél en niet doet
212
- - ✅ **Herkennen van patronen**: het model leert uit combinaties (bijv. *geslacht + klasse + leeftijd*).
213
- - ✅ **Schatten, geen zekerheid**: het geeft **kansen**, geen waarheden.
214
- - ❌ **Geen moreel oordeel**: data verklaart, maar rechtvaardigt niet.
215
- - ❌ **Geen individuele lotsbeschikking**: context die niet in data staat (locatie op het moment, gedrag van omstanders) blijft onzichtbaar.
216
-
217
- ---
218
-
219
- ### Klaar om te beginnen?
220
- Scroll door de grafieken, lees de toelichtingen en voer je eigen kenmerken in.
221
- Het model berekent je **overlevingskans** en we schetsen een **scène** uit die nacht — zodat data weer mens wordt.
222
  """
223
 
224
  # =========================
@@ -250,8 +242,9 @@ with gr.Blocks(css=CUSTOM_CSS, theme=gr.themes.Default(primary_hue="blue")) as d
250
  with gr.Column(scale=2, min_width=420):
251
  gr.Markdown(INTRO_MD, elem_classes=["intro-card","scroll-md"])
252
  with gr.Column(scale=1, min_width=320):
253
- if HERO_PATH:
254
- gr.Image(value=HERO_PATH, interactive=False, show_label=False, elem_classes=["hero-img"])
 
255
  else:
256
  gr.Markdown("⚠️ **Geen afbeelding gevonden.** Plaats `titanic_bg.png` of `titanic_bg.jpg` in de root.")
257
 
@@ -265,7 +258,7 @@ with gr.Blocks(css=CUSTOM_CSS, theme=gr.themes.Default(primary_hue="blue")) as d
265
  # Visualisaties
266
  gr.Markdown("## 📊 Verken de data", elem_classes=["panel"])
267
  with gr.Row():
268
- g1 = gr.Plot(label="Overleving per klasse")
269
  g2 = gr.Plot(label="Leeftijdsverdeling per status")
270
  with gr.Row():
271
  g3 = gr.Plot(label="Geslachtsverdeling")
@@ -289,7 +282,7 @@ with gr.Blocks(css=CUSTOM_CSS, theme=gr.themes.Default(primary_hue="blue")) as d
289
  # callbacks
290
  def load_graphs():
291
  return (
292
- plot_overleving_per_klasse(df),
293
  plot_leeftijdsverdeling(df),
294
  plot_geslacht(df),
295
  plot_fare_vs_klasse(df),
 
1
+ # app.py — Titanic Data Adventure (wit thema, vaste layout, 2D passagierskaart met hover)
2
  import gradio as gr
3
  import pandas as pd
4
  import numpy as np
 
76
  )
77
  return fig
78
 
79
+ def plot_passenger_map(dfx):
80
+ """
81
+ 2D puntenkaart: elke passagier = 1 punt.
82
+ X-as: leeftijd, Y-as: ticketprijs (fare).
83
+ Kleur = overlevingsstatus, symbool = klasse, grootte = family_size.
84
+ Hover toont zoveel mogelijk relevante velden (naam indien aanwezig).
85
+ """
86
+ # Bepaal welke extra velden we kunnen tonen
87
+ extra_cols = [c for c in ["name","ticket","cabin"] if c in dfx.columns]
88
+ hover_cols = ["pclass","sex","age","sibsp","parch","family_size","fare","embarked","status"] + extra_cols
89
+
90
+ fig = px.scatter(
91
+ dfx,
92
+ x="age", y="fare",
93
+ color="status",
94
+ symbol="pclass",
95
+ size="family_size",
96
+ size_max=16,
97
+ opacity=0.75,
98
+ hover_data=hover_cols,
99
  color_discrete_map={"Overleefd":"#1B4B91","Niet overleefd":"#A3B1C6"},
100
+ labels={"age":"Leeftijd (jaar)", "fare":"Ticketprijs (£)"}
101
  )
102
+ # Zachte jitter om overlappende punten iets te spreiden (alleen visueel: via marker line width klein)
103
+ fig.update_traces(marker=dict(line=dict(width=0.3, color="#444")))
104
+ return make_plot(fig, "Passagierskaart — Leeftijd (x) versus Ticketprijs (y)")
105
 
106
  def plot_leeftijdsverdeling(dfx):
107
  f = px.histogram(
 
183
  return story
184
 
185
  # =========================
186
+ # Introductietekst (aangepast: uitleg over passagierskaart)
187
  # =========================
188
  INTRO_MD = """
189
  # 🛳️ Titanic Data Adventure
 
196
 
197
  ---
198
 
 
 
 
 
 
 
 
199
  ## Wat je in dit dashboard gaat zien
200
+ - **Passagierskaart (2D)** elk bolletje is één passagier.
201
+ *X-as = leeftijd*, *Y-as = ticketprijs*, **kleur = overleving**, **symbool = klasse**, **grootte = familieomvang**.
202
+ Beweeg met de muis over een punt om details te zien (bijv. klasse, geslacht, haven, en als aanwezig – naam/ticket/cabin).
203
+ - **Leeftijdsverdeling** overlappende histogrammen tonen verschillen tussen overlevers en niet-overlevers.
204
+ - **Geslachtsverdeling** verhoudingen mannen/vrouwen in de dataset.
205
+ - **Fare per klasse** — prijsverschillen en spreiding, gekoppeld aan overleving.
206
+ - **Jouw scenario** — stel je eigen kenmerken in, bereken je kans en lees een korte scène uit die nacht.
 
 
 
 
 
 
 
 
 
 
 
 
 
207
 
208
  ---
209
 
210
  ## Wat een model wél en niet doet
211
+ - ✅ **Herkennen van patronen** in combinaties (bijv. *geslacht + klasse + leeftijd*).
212
+ - ✅ **Schatten, geen zekerheid** het geeft **kansen**, geen waarheden.
213
+ - ❌ Geen moreel oordeel of individuele lotsbeschikking: context buiten de data blijft onzichtbaar.
 
 
 
 
 
 
 
214
  """
215
 
216
  # =========================
 
242
  with gr.Column(scale=2, min_width=420):
243
  gr.Markdown(INTRO_MD, elem_classes=["intro-card","scroll-md"])
244
  with gr.Column(scale=1, min_width=320):
245
+ hero_path = get_hero_image_path()
246
+ if hero_path:
247
+ gr.Image(value=hero_path, interactive=False, show_label=False, elem_classes=["hero-img"])
248
  else:
249
  gr.Markdown("⚠️ **Geen afbeelding gevonden.** Plaats `titanic_bg.png` of `titanic_bg.jpg` in de root.")
250
 
 
258
  # Visualisaties
259
  gr.Markdown("## 📊 Verken de data", elem_classes=["panel"])
260
  with gr.Row():
261
+ g1 = gr.Plot(label="Passagierskaart (2D)")
262
  g2 = gr.Plot(label="Leeftijdsverdeling per status")
263
  with gr.Row():
264
  g3 = gr.Plot(label="Geslachtsverdeling")
 
282
  # callbacks
283
  def load_graphs():
284
  return (
285
+ plot_passenger_map(df), # NIEUW: 2D passagierskaart
286
  plot_leeftijdsverdeling(df),
287
  plot_geslacht(df),
288
  plot_fare_vs_klasse(df),