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

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +28 -30
app.py CHANGED
@@ -1,4 +1,4 @@
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,32 +76,32 @@ def make_plot(fig, title):
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(
@@ -140,7 +140,6 @@ HERO_PATH = get_hero_image_path()
140
  # Interactieve voorspelling + avontuur-tekst
141
  # =========================
142
  def predict_and_story(pclass, sex, age, sibsp, parch, fare, embarked):
143
- # Encode invoer net als model
144
  sex_enc = 1 if str(sex).lower().startswith("v") else 0 # Vrouw=1, Man=0
145
  embarked_enc = {"C":0,"Q":1,"S":2}.get(embarked, 2)
146
  family_size = int(sibsp) + int(parch) + 1
@@ -149,7 +148,6 @@ def predict_and_story(pclass, sex, age, sibsp, parch, fare, embarked):
149
  prob = float(MODEL.predict_proba(X_row)[0,1])
150
  pct = prob * 100
151
 
152
- # Avontuur-tekst op basis van invoer en kans
153
  klasse_txt = {1:"eerste", 2:"tweede", 3:"derde"}.get(int(pclass), "onbekende")
154
  haven_txt = {"C":"Cherbourg","Q":"Queenstown","S":"Southampton"}.get(embarked, "een onbekende haven")
155
  rol_txt = "vrouw" if sex_enc==1 else "man"
@@ -183,7 +181,7 @@ Je voelt de houten reling koud onder je hand. {ending}
183
  return story
184
 
185
  # =========================
186
- # Introductietekst (aangepast: uitleg over passagierskaart)
187
  # =========================
188
  INTRO_MD = """
189
  # 🛳️ Titanic Data Adventure
@@ -192,14 +190,14 @@ INTRO_MD = """
192
  **April 1912.**
193
  De RMS *Titanic* vertrekt richting New York: een drijvend paleis, gevuld met verwachtingen. Aan boord: industriëlen in avondkleding, jonge gezinnen met één koffer, bemanningsleden die elke dag routine tot ritueel verheffen. De zee is kalm; de toekomst lijkt maakbaar.
194
 
195
- Meer dan een eeuw later kijken wij mee — niet met verrekijkers of logboeken, maar met **data**. Elk record in deze dataset is een menselijk verhaal: iemand met een plek aan tafel, een ticket, een familie, een keuze. Door de gegevens te verkennen, begrijpen we beter **wie overleefde — en waarom**.
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.
@@ -258,7 +256,7 @@ with gr.Blocks(css=CUSTOM_CSS, theme=gr.themes.Default(primary_hue="blue")) as d
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,7 +280,7 @@ with gr.Blocks(css=CUSTOM_CSS, theme=gr.themes.Default(primary_hue="blue")) as d
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),
 
1
+ # app.py — Titanic Data Adventure (wit thema, vaste layout, 2D overleving vs leeftijd met ronde bolletjes)
2
  import gradio as gr
3
  import pandas as pd
4
  import numpy as np
 
76
  )
77
  return fig
78
 
79
+ def plot_survival_vs_age(dfx):
80
  """
81
+ 2D plot: ronde bolletjes; X = leeftijd, Y = overleving (twee rijen).
82
+ Kleur = geslacht (duidelijk contrast), hover toont rijke passagiersinfo.
 
 
83
  """
84
+ d = dfx.copy()
85
+ d["overleving"] = d["survived"].map({0:"Niet overleefd", 1:"Overleefd"})
86
+ extra_cols = [c for c in ["name","ticket","cabin"] if c in d.columns]
87
+ hover_cols = ["pclass","sex","age","sibsp","parch","family_size","fare","embarked","overleving"] + extra_cols
88
 
89
  fig = px.scatter(
90
+ d,
91
+ x="age",
92
+ y="overleving", # categorische y: twee nette rijen
93
+ color="sex", # extra dimensie zonder rommel
 
 
 
94
  hover_data=hover_cols,
95
+ labels={"age":"Leeftijd (jaar)", "overleving":"Overleving"},
96
+ color_discrete_map={"Male":"#A3B1C6","Female":"#1B4B91"},
97
+ render_mode="auto"
98
+ )
99
+ fig.update_traces(
100
+ mode="markers",
101
+ marker=dict(symbol="circle", size=9, opacity=0.7, line=dict(width=0.6, color="white"))
102
  )
103
+ fig.update_yaxes(categoryorder="array", categoryarray=["Niet overleefd","Overleefd"], title=None)
104
+ return make_plot(fig, "Overleving (y) versus Leeftijd (x) — ronde bolletjes (hover voor details)")
 
105
 
106
  def plot_leeftijdsverdeling(dfx):
107
  f = px.histogram(
 
140
  # Interactieve voorspelling + avontuur-tekst
141
  # =========================
142
  def predict_and_story(pclass, sex, age, sibsp, parch, fare, embarked):
 
143
  sex_enc = 1 if str(sex).lower().startswith("v") else 0 # Vrouw=1, Man=0
144
  embarked_enc = {"C":0,"Q":1,"S":2}.get(embarked, 2)
145
  family_size = int(sibsp) + int(parch) + 1
 
148
  prob = float(MODEL.predict_proba(X_row)[0,1])
149
  pct = prob * 100
150
 
 
151
  klasse_txt = {1:"eerste", 2:"tweede", 3:"derde"}.get(int(pclass), "onbekende")
152
  haven_txt = {"C":"Cherbourg","Q":"Queenstown","S":"Southampton"}.get(embarked, "een onbekende haven")
153
  rol_txt = "vrouw" if sex_enc==1 else "man"
 
181
  return story
182
 
183
  # =========================
184
+ # Introductietekst (aangepast: uitleg over 2D-bollenplot)
185
  # =========================
186
  INTRO_MD = """
187
  # 🛳️ Titanic Data Adventure
 
190
  **April 1912.**
191
  De RMS *Titanic* vertrekt richting New York: een drijvend paleis, gevuld met verwachtingen. Aan boord: industriëlen in avondkleding, jonge gezinnen met één koffer, bemanningsleden die elke dag routine tot ritueel verheffen. De zee is kalm; de toekomst lijkt maakbaar.
192
 
193
+ Meer dan een eeuw later kijken wij mee — niet met verrekijkers of logboeken, maar met **data**. Elk record in deze dataset is een menselijk verhaal. Door de gegevens te verkennen, begrijpen we beter **wie overleefde — en waarom**.
194
 
195
  ---
196
 
197
  ## Wat je in dit dashboard gaat zien
198
+ - **Overleving versus leeftijd (2D)** — elk **rond bolletje** is één passagier.
199
+ *X-as = leeftijd*, *Y-as = overleving* (twee rijen: *Niet overleefd* en *Overleefd*).
200
+ **Kleur = geslacht**, en **hover** toont details (klasse, familieomvang, vertrekhaven, prijs en – als aanwezig – naam/ticket/cabin).
201
  - **Leeftijdsverdeling** — overlappende histogrammen tonen verschillen tussen overlevers en niet-overlevers.
202
  - **Geslachtsverdeling** — verhoudingen mannen/vrouwen in de dataset.
203
  - **Fare per klasse** — prijsverschillen en spreiding, gekoppeld aan overleving.
 
256
  # Visualisaties
257
  gr.Markdown("## 📊 Verken de data", elem_classes=["panel"])
258
  with gr.Row():
259
+ g1 = gr.Plot(label="Overleving vs Leeftijd (2D)")
260
  g2 = gr.Plot(label="Leeftijdsverdeling per status")
261
  with gr.Row():
262
  g3 = gr.Plot(label="Geslachtsverdeling")
 
280
  # callbacks
281
  def load_graphs():
282
  return (
283
+ plot_survival_vs_age(df), # NIEUW: ronde bolletjes, Y=overleving
284
  plot_leeftijdsverdeling(df),
285
  plot_geslacht(df),
286
  plot_fare_vs_klasse(df),