diff --git a/src/assets/dash_clientside.js b/src/assets/dash_clientside.js index babba1c..2c41e6a 100644 --- a/src/assets/dash_clientside.js +++ b/src/assets/dash_clientside.js @@ -11,11 +11,15 @@ window.dash_clientside = Object.assign({}, window.dash_clientside, { }).bindTooltip(feature.properties.tooltip); }, clusterToLayer: function (feature, latlng, index, context) { + console.log(feature); + console.log(index); + console.log(context); + const count = feature.properties.point_count; const size = count < 100 ? 30 : count < 1000 ? 40 : 50; - const color = "#333"; // Default cluster color + const color = "#555"; // Default cluster color const icon = L.divIcon({ - html: `
${count}
`, + html: `
${count}
`, className: "marker-cluster", iconSize: L.point(size, size), }); diff --git a/src/figures.py b/src/figures.py index 15319b8..a63cab8 100644 --- a/src/figures.py +++ b/src/figures.py @@ -430,7 +430,7 @@ def get_geographic_maps(dff: pl.DataFrame) -> list | None: """ # Si les données sont trop importantes on utilise une carte chloropleth - if dff.height > 5000: + if dff.height > 50000: return [ dbc.Col( dcc.Graph( @@ -443,21 +443,30 @@ def get_geographic_maps(dff: pl.DataFrame) -> list | None: ] # Liste des codes départements Outre-Mer - dom_codes = ["971", "972", "973", "974", "976"] + region_codes: list = ["Métropole", "971", "972", "973", "974", "976"] + dom_codes = region_codes[1:] # Couleurs accessibles (Okabe-Ito) color_acheteur = "#E69F00" # Orange color_titulaire = "#56B4E9" # Bleu ciel - regions = { - "Métropole": dff.filter(~pl.col("acheteur_departement_code").is_in(dom_codes)) - } + regions = {} # Ajout des DOM s'ils ont des données - for code in dom_codes: - dff_dom = dff.filter(pl.col("acheteur_departement_code") == code) - if dff_dom.height > 0: - name = f"Département {code}" + for code in region_codes: + if code == "Métropole": + dff_region = dff.filter( + ( + ~pl.col("acheteur_departement_code").is_in(dom_codes) + | (~pl.col("titulaire_departement_code").is_in(dom_codes)) + ) + ) + else: + dff_region = dff.filter( + (pl.col("acheteur_departement_code") == code) + | (pl.col("titulaire_departement_code") == code) + ) + if dff_region.height > 0: if code == "971": name = "Guadeloupe" elif code == "972": @@ -468,16 +477,21 @@ def get_geographic_maps(dff: pl.DataFrame) -> list | None: name = "La Réunion" elif code == "976": name = "Mayotte" - regions[name] = dff_dom + elif code == "Métropole": + name = "Métropole" + else: + name = f"Département {code}" + + regions[name] = dff_region # Region centers for dash-leaflet region_centers = { - "Métropole": ([46.6, 2.2], 6), + "Métropole": ([46.6, 2.2], 5), "Guadeloupe": ([16.23, -61.55], 9), "Martinique": ([14.64, -61.02], 10), "Guyane": ([3.93, -53.12], 7), - "La Réunion": ([-21.11, 55.53], 10), - "Mayotte": ([-12.82, 45.16], 11), + "La Réunion": ([-21.11, 55.53], 9), + "Mayotte": ([-12.82, 45.16], 10), } # JavaScript functions for styling @@ -487,9 +501,6 @@ def get_geographic_maps(dff: pl.DataFrame) -> list | None: cols = [] for name, region_df in regions.items(): - # Prepare data for GeoJSON - marker_dicts = [] - # Trace Acheteurs mask_acheteur = ( region_df.select( @@ -503,9 +514,11 @@ def get_geographic_maps(dff: pl.DataFrame) -> list | None: ) ) + acheteurs_marker_dicts = [] + if mask_acheteur.height > 0: for row in mask_acheteur.to_dicts(): - marker_dicts.append( + acheteurs_marker_dicts.append( { "lat": row["acheteur_latitude"], "lon": row["acheteur_longitude"], @@ -527,9 +540,11 @@ def get_geographic_maps(dff: pl.DataFrame) -> list | None: ) ) + titulaires_marker_dicts = [] + if mask_titulaire.height > 0: for row in mask_titulaire.to_dicts(): - marker_dicts.append( + titulaires_marker_dicts.append( { "lat": row["titulaire_latitude"], "lon": row["titulaire_longitude"], @@ -538,10 +553,11 @@ def get_geographic_maps(dff: pl.DataFrame) -> list | None: } ) - geojson_data = dlx.dicts_to_geojson(marker_dicts) + acheteurs_geojson_data = dlx.dicts_to_geojson(acheteurs_marker_dicts) + titulaires_geojson_data = dlx.dicts_to_geojson(titulaires_marker_dicts) center, zoom = region_centers.get(name, ([46.6, 2.2], 6)) - col_width = 12 if name == "Métropole" else 3 + col_width = 6 if name == "Métropole" else 3 region_id = name.lower().replace(" ", "-") cols.append( dbc.Col( @@ -551,12 +567,22 @@ def get_geographic_maps(dff: pl.DataFrame) -> list | None: [ dl.TileLayer(), dl.GeoJSON( - data=geojson_data, + data=titulaires_geojson_data, cluster=True, zoomToBoundsOnClick=True, pointToLayer=point_to_layer, clusterToLayer=cluster_to_layer, - id=f"geojson-{region_id}", + id=f"geojson-{region_id}-titulaires", + options={"fillColor": color_titulaire}, + ), + dl.GeoJSON( + data=acheteurs_geojson_data, + cluster=True, + zoomToBoundsOnClick=True, + pointToLayer=point_to_layer, + clusterToLayer=cluster_to_layer, + id=f"geojson-{region_id}-acheteurs", + options={"fillColor": color_acheteur}, ), ], center=center, diff --git a/src/pages/statistiques.py b/src/pages/statistiques.py index 1a74231..99fcbc7 100644 --- a/src/pages/statistiques.py +++ b/src/pages/statistiques.py @@ -163,6 +163,7 @@ def udpate_dashboard_cards( total_montant = df_per_uid.select(pl.col("montant").sum()).item() nb_marches = df_per_uid.height + # À transformer en fonction card_basic_counts = [ html.P(["Nombre de marchés : ", html.Strong(str(format_number(nb_marches)))]), html.P(