diff --git a/pages/Vue_globale.py b/pages/Vue_globale.py index 5bbbc4c..f32e3c6 100644 --- a/pages/Vue_globale.py +++ b/pages/Vue_globale.py @@ -605,7 +605,7 @@ def load_with_progress(): height=500, template='plotly_white', showlegend=False, - margin=dict(t=100, b=50, l=50, r=50), # Augmenter la marge du haut (t) pour plus d'espace + margin=dict(t=100, b=50, l=50, r=50), # Augmenter la marge du haut pour plus d'espace ) # Mise à jour des titres des axes Y @@ -816,7 +816,13 @@ def load_with_progress(): # Mise en page du graphique 3D fig.update_layout( - title='Distribution des pathologies', + title=dict( + text='Évolution des pathologies selon trois dimensions clés', + y=0.95, + x=0.4, + xanchor='right', + yanchor='top' + ), scene=dict( xaxis_title='Nombre d\'hospitalisations', yaxis_title='Durée moyenne de séjour (jours)', @@ -838,6 +844,27 @@ def load_with_progress(): ), width=800, sliders=sliders, + annotations=[ + dict( + text="Légende :
La taille des points représente le nombre d'hospitalisations
La couleur indique la durée moyenne de séjour", + showarrow=False, + xref="paper", yref="paper", + x=0.8, y=1.1, + align="left", + xanchor="left" + ) + ], + margin=dict(t=100, b=50, l=50, r=50) # Augmenter la marge du haut pour l'annotation + ) + + # Ajout de configuration pour une animation plus fluide + fig.update_traces( + hoverinfo="none", # Désactiver temporairement le hover pendant l'animation + customdata=combined_data_3d[['nom_pathologie', 'nbr_hospi', 'AVG_duree_hospi', 'indice_comparatif_tt_age_percent']].values, + ) + + # Ajout des boutons de contrôle pour l'animation + fig.update_layout( updatemenus=[{ "buttons": [ { @@ -871,13 +898,101 @@ def load_with_progress(): }] ) - # Ajout de configuration pour une animation plus fluide - fig.update_traces( - hoverinfo="none", # Désactiver temporairement le hover pendant l'animation - customdata=combined_data_3d[['nom_pathologie', 'nbr_hospi', 'AVG_duree_hospi', 'indice_comparatif_tt_age_percent']].values, + # Affichage du graphique + st.plotly_chart(fig, use_container_width=True) + + # Tableau récapitulatif détaillé + st.subheader("Évolution des pathologies (2018-2022)") + + # Calculer les évolutions année par année + evolutions_by_year = {} + years = sorted(df_nbr_hospi_filtered['year'].dt.year.unique()) + + for i in range(len(years)-1): + current_year = years[i] + next_year = years[i+1] + + # Données pour l'année courante et suivante + current_data = df_nbr_hospi_filtered[df_nbr_hospi_filtered['year'].dt.year == current_year].groupby('nom_pathologie')['nbr_hospi'].sum() + next_data = df_nbr_hospi_filtered[df_nbr_hospi_filtered['year'].dt.year == next_year].groupby('nom_pathologie')['nbr_hospi'].sum() + + # Calculer l'évolution en pourcentage + evolution = ((next_data - current_data) / current_data * 100).fillna(0) + evolutions_by_year[f'{current_year}-{next_year}'] = evolution + + # Créer le DataFrame de base avec le nombre total d'hospitalisations + df_summary = df_nbr_hospi_filtered.groupby('nom_pathologie')['nbr_hospi'].sum().reset_index() + + # Ajouter les évolutions année par année + for period, evolution in evolutions_by_year.items(): + df_summary = df_summary.merge( + evolution.reset_index().rename(columns={'nbr_hospi': f'Evolution_{period}'}), + on='nom_pathologie', + how='left' + ) + + # Calculer l'évolution globale (2018-2022) + hospi_2018 = df_nbr_hospi_filtered[df_nbr_hospi_filtered['year'].dt.year == 2018].groupby('nom_pathologie')['nbr_hospi'].sum() + hospi_2022 = df_nbr_hospi_filtered[df_nbr_hospi_filtered['year'].dt.year == 2022].groupby('nom_pathologie')['nbr_hospi'].sum() + evolution_globale = ((hospi_2022 - hospi_2018) / hospi_2018 * 100).fillna(0) + + # Ajouter l'évolution globale au DataFrame + df_summary = df_summary.merge( + evolution_globale.reset_index().rename(columns={'nbr_hospi': 'Evolution_globale'}), + on='nom_pathologie', + how='left' ) - st.plotly_chart(fig, use_container_width=True) + # Trier par évolution globale décroissante + df_summary = df_summary.sort_values('Evolution_globale', ascending=False) + + # Renommer les colonnes pour l'affichage + df_summary.columns = ['Pathologie', 'Hospitalisations'] + [f'Évol. {period} (%)' for period in evolutions_by_year.keys()] + ['Évol. 2018-2022 (%)'] + + # Colonnes d'évolution pour le gradient + evolution_columns = ['Évol. 2018-2019 (%)', 'Évol. 2019-2020 (%)', + 'Évol. 2020-2021 (%)', 'Évol. 2021-2022 (%)', + 'Évol. 2018-2022 (%)'] + + # Formater et afficher le tableau + st.dataframe( + df_summary.style.format({ + 'Hospitalisations': '{:,.0f}', + 'Évol. 2018-2019 (%)': '{:+.1f}%', + 'Évol. 2019-2020 (%)': '{:+.1f}%', + 'Évol. 2020-2021 (%)': '{:+.1f}%', + 'Évol. 2021-2022 (%)': '{:+.1f}%', + 'Évol. 2018-2022 (%)': '{:+.1f}%' + }).background_gradient( + subset=evolution_columns, + cmap='RdYlBu_r' + ), + use_container_width=True + ) + + st.markdown("---") + + # Deuxième tableau avec les baisses en premier + st.subheader("Évolution des pathologies (2018-2022) - Baisses les plus importantes") + + # Utiliser le même DataFrame mais trié dans l'ordre inverse + df_summary_desc = df_summary.sort_values('Évol. 2018-2022 (%)', ascending=True) + + # Afficher le deuxième tableau + st.dataframe( + df_summary_desc.style.format({ + 'Hospitalisations': '{:,.0f}', + 'Évol. 2018-2019 (%)': '{:+.1f}%', + 'Évol. 2019-2020 (%)': '{:+.1f}%', + 'Évol. 2020-2021 (%)': '{:+.1f}%', + 'Évol. 2021-2022 (%)': '{:+.1f}%', + 'Évol. 2018-2022 (%)': '{:+.1f}%' + }).background_gradient( + subset=evolution_columns, + cmap='RdYlBu_r' + ), + use_container_width=True + ) # Démographie with tab4: