diff --git a/README.md b/README.md index 7c9154e..4a76aa7 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ An interactive Python Dash app to visualize, analyze, and explore your jogging or running sessions recorded as GPX/FIT files.

- Description + Description

--- diff --git a/WebAppFITDashboard.png b/WebAppFITDashboard.png new file mode 100644 index 0000000..d22cd3e Binary files /dev/null and b/WebAppFITDashboard.png differ diff --git a/WebAppGPXDashboard.jpg b/WebAppGPXDashboard.jpg deleted file mode 100644 index 891295c..0000000 Binary files a/WebAppGPXDashboard.jpg and /dev/null differ diff --git a/WebAppGPXDashboard.png b/WebAppGPXDashboard.png new file mode 100644 index 0000000..b7ad910 Binary files /dev/null and b/WebAppGPXDashboard.png differ diff --git a/fit_app.py b/fit_app.py index d5526b3..23c8c9e 100644 --- a/fit_app.py +++ b/fit_app.py @@ -27,13 +27,10 @@ from fitparse import FitFile # === Helper Functions === def list_fit_files(): - folder = './fit_files' # Ordnerpfad anpassen - if not os.path.exists(folder): - os.makedirs(folder) - + folder = './fit_files' files = [f for f in os.listdir(folder) if f.lower().endswith('.fit')] - # Datum extrahieren für Sortierung + # Extract date from the start of the filename and sort descending def extract_date(filename): try: return datetime.datetime.strptime(filename[:10], '%d.%m.%Y') # Format DD.MM.YYYY @@ -523,6 +520,7 @@ def create_heart_rate_plot(df): mode='lines', #name='Geglättete Herzfrequenz', line=dict(color='#E43D70', width=2), + showlegend=False, hovertemplate=( "Zeit: %{x}
" + "Herzfrequenz: %{y:.0f} bpm
" + @@ -530,18 +528,18 @@ def create_heart_rate_plot(df): ) )) - # Optional: Raw Heart Rate als dünnere, transparente Linie - if not df['heart_rate'].isna().all(): - fig.add_trace(go.Scatter( - x=df['time'], - y=df['heart_rate'], - mode='lines', - name='Raw Herzfrequenz', - line=dict(color='#E43D70', width=1, dash='dot'), - opacity=0.3, - showlegend=False, - hoverinfo='skip' - )) + # # Optional: Raw Heart Rate als dünnere, transparente Linie + # if not df['heart_rate'].isna().all(): + # fig.add_trace(go.Scatter( + # x=df['time'], + # y=df['heart_rate'], + # mode='lines', + # name='Raw Herzfrequenz', + # line=dict(color='#E43D70', width=1, dash='dot'), + # opacity=0.3, + # showlegend=False, + # hoverinfo='skip' + # )) # Durchschnittslinie if mean_hr > 0: @@ -569,31 +567,30 @@ def create_heart_rate_plot(df): # Heart Rate Zonen (optional) if mean_hr > 0: - # Geschätzte maximale Herzfrequenz (220 - Alter, hier als Beispiel 190) - max_hr_estimated = 190 # Du kannst das anpassen + # Geschätzte maximale Herzfrequenz (Beispiel: 200 bpm) + # Heart Rate Zonen (optional) + # Geschätzte maximale Herzfrequenz + max_hr_estimated = 200 # oder z. B. 220 - alter - # Zone 1: Sehr leicht (50-60% HRmax) - zone1_lower = max_hr_estimated * 0.5 - zone1_upper = max_hr_estimated * 0.6 + # Definiere feste HR-Zonen in BPM + zones = [ + {"name": "Zone 1", "lower": 0, "upper": 124, "color": "#F4A4A3"}, + {"name": "Zone 2", "lower": 124, "upper": 154, "color": "#EF7476"}, + {"name": "Zone 3", "lower": 154, "upper": 169, "color": "#EA4748"}, + {"name": "Zone 4", "lower": 169, "upper": 184, "color": "#E02628"}, + {"name": "Zone 5", "lower": 184, "upper": max_hr_estimated, "color": "#B71316"}, + ] - # Zone 2: Leicht (60-70% HRmax) - zone2_upper = max_hr_estimated * 0.7 - - # Zone 3: Moderat (70-80% HRmax) - zone3_upper = max_hr_estimated * 0.8 - - # Zone 4: Hart (80-90% HRmax) #update: bis 100% - zone4_upper = max_hr_estimated * 1.0 - - # Füge Zonen-Bereiche als Hintergrundbereiche hinzu - fig.add_hrect(y0=zone1_lower, y1=zone1_upper, - fillcolor="green", opacity=0.1, line_width=0) - fig.add_hrect(y0=zone1_upper, y1=zone2_upper, - fillcolor="yellow", opacity=0.1, line_width=0) - fig.add_hrect(y0=zone2_upper, y1=zone3_upper, - fillcolor="orange", opacity=0.1, line_width=0) - fig.add_hrect(y0=zone3_upper, y1=zone4_upper, - fillcolor="red", opacity=0.1, line_width=0) + # Zeichne Zonen als Hintergrund (horizontale Rechtecke) + for zone in zones: + fig.add_hrect( + y0=zone["lower"], y1=zone["upper"], + fillcolor=zone["color"], + opacity=0.1, + line_width=0, + annotation_text=zone["name"], # optional: Name der Zone einblenden + annotation_position="top left" + ) # Layout title_text = f'Herzfrequenz über die Zeit (geglättete)'