Skip to content

Commit

Permalink
[tg] - amélioration layout 3 onglets
Browse files Browse the repository at this point in the history
  • Loading branch information
tgazagnes committed Jun 6, 2024
1 parent f7dc00c commit fb43f53
Showing 1 changed file with 83 additions and 100 deletions.
183 changes: 83 additions & 100 deletions dashboards/app/pages/data.py
Original file line number Diff line number Diff line change
Expand Up @@ -32,10 +32,14 @@

if st.session_state["authentication_status"]:
if filtre_niveau == "" and filtre_collectivite == "":
st.write("Aucune sélection de territoire n'a été effectuée")
with st.sidebar:
st.warning("⚠️ Aucune sélection de territoire n'a été effectuée")
else:
st.write(f"Votre territoire : {filtre_niveau} {filtre_collectivite}")

with st.sidebar:
st.info(
f" Territoire sélectionné : **{filtre_niveau} {filtre_collectivite}**",
icon="🌍",
)
# Définition d'une fonction pour charger les données du nombre de dé[email protected]_data
def load_df_dict_corr_dechet_materiau():
return pd.read_csv(
Expand Down Expand Up @@ -201,6 +205,14 @@ def french_format(x: int) -> str:
"Autre": "#F3B900",
}

# Message d'avertissement en haut de page si nb de collectes < 5
if nb_collectes_int <= 5:
st.warning(
"⚠️ Faible nombre de ramassages ("
+ str(nb_collectes_int)
+ ") dans la base de données."
)

# Ligne 1 : 2 cellules avec les indicateurs clés en haut de page
l1_col1, l1_col2, l1_col3 = st.columns(3)

Expand All @@ -221,58 +233,28 @@ def french_format(x: int) -> str:
cell3 = l1_col3.container(border=True)
cell3.metric("Nombre de ramassages", french_format(nb_collectes_int))

# Message d'avertissement nb de collectes en dessous de 5
if nb_collectes_int <= 5:
st.warning(
"⚠️ Faible nombre de ramassages ("
+ str(nb_collectes_int)
+ ") dans la base de données."
)

# Note méthodo pour expliquer les données retenues pour l'analyse
with st.expander(
"Note sur les données utilisées dans les graphiques ci-dessous"
):
st.caption(
f"Il n’y a pas de correspondance entre le poids et le volume global\
with st.expander("Note sur les données utilisées dans cet onglet"):
st.markdown(
f"""
- Il n’y a pas de correspondance entre le poids et le volume global\
de déchets indiqués car certaines organisations \
ne renseignent que le volume sans mention de poids \
(protocole de niveau 1) ou inversement."
)
st.caption(
f"De plus, \
les chiffres ci-dessous sont calculés sur **{french_format(nb_collectes_carac)}** ramassages \
(protocole de niveau 1) ou inversement.
- Les chiffres ci-dessous sont calculés sur **{french_format(nb_collectes_carac)}** ramassages \
ayant fait l’objet d’une estimation des volumes \
par matériau, soit un volume total de {french_format(volume_total_categorise_m3)} m³.\
Les relevés de niveau 0 et les relevés comptabilisant 100% de déchets 'AUTRES' ont été exclus."
)
df_note_methodo = df_volume.groupby(["Exclusions"], as_index=False)[
"ID_RELEVE"
].count()
fig_data = px.pie(
df_note_methodo,
values="ID_RELEVE",
names="Exclusions",
title="Nombre de ramassages inclus ou exclus dans les analyses ci-dessous",
color="Exclusions",
color_discrete_sequence=px.colors.sequential.RdBu,
Les relevés de niveau 0 et les relevés comptabilisant 100% de déchets 'AUTRES' ont été exclus.
"""
)
# Réglage du texte affiché, format et taille de police
fig_data.update_traces(
textinfo="value+percent+label",
texttemplate="%{label}<br>%{value:.0f} relevés<br>%{percent:.0%}",
textfont_size=14,
hoverinfo=None,
insidetextorientation="horizontal",
rotation=90,
# Afficher le nombre de relevés inclus ou exclus
df_note_methodo = (
df_volume.groupby(["Exclusions"], as_index=True)["ID_RELEVE"]
.count()
.sort_values(ascending=False)
)
# Cacher la légende
fig_data.update_layout(
showlegend=False,
separators=", ", # Séparateurs décimales et milliers
)

st.plotly_chart(fig_data)
df_note_methodo.rename("Nombre de relevés", inplace=True)
st.dataframe(df_note_methodo)

# Ligne 2 : 2 graphiques en ligne : donut et bar chart matériaux

Expand Down Expand Up @@ -339,7 +321,7 @@ def french_format(x: int) -> str:

fig2.update_layout(
autosize=True,
# uniformtext_minsize=8,
# uniformtext_minsize=10,
uniformtext_mode="hide",
xaxis_tickangle=-45,
showlegend=False,
Expand Down Expand Up @@ -434,6 +416,12 @@ def french_format(x: int) -> str:

# Afficher le graphique
with st.container(border=True):

# Message d'avertissement si pas de données à afficher
if len(df_typemilieu) == 0:
st.warning("⚠️ Aucune donnée à afficher")

# Afficher le graphique
st.plotly_chart(fig3, use_container_width=True)

# Ne pas faire apparaître la catégorie "Multi-lieux"
Expand All @@ -444,7 +432,7 @@ def french_format(x: int) -> str:
df_nb_par_milieu.rename(
{
"TYPE_MILIEU": "Milieu",
"ID_RELEVE": "",
"ID_RELEVE": "Ramassages",
},
axis=1,
inplace=True,
Expand All @@ -463,7 +451,7 @@ def french_format(x: int) -> str:
)

# Ligne 3 : Graphe par milieu , lieu et année
st.write("**Filtrer les données par année, type de milieu ou type de lieu**")
st.write("**Détail par année, type de milieu ou de lieu**")

# Étape 1: Création des filtres

Expand Down Expand Up @@ -615,6 +603,12 @@ def french_format(x: int) -> str:
# & (df_other_metrics["TYPE_LIEU"] == selected_type_lieu)
# ]

# Message d'avertissement nb de collectes en dessous de 5
if len(df_filtered) <= 5:
st.warning(
f"⚠️ Faible nombre de ramassages ({len(df_filtered)}) dans la base de données."
)

# Ligne 5 : Metriques filtrés
l5_col1, l5_col2, l5_col3 = st.columns(3)
cell6 = l5_col1.container(border=True)
Expand All @@ -637,13 +631,6 @@ def french_format(x: int) -> str:
nombre_collectes_filtered = len(df_filtered)
cell8.metric("Nombre de ramassages", french_format(nombre_collectes_filtered))

# Message d'avertissement nb de collectes en dessous de 5
if len(df_filtered) <= 5:
st.warning(
"⚠️ Faible nombre de ramassages disponibles dans la base de données : "
+ str(len(df_filtered))
)

# Étape 3: Preparation dataframe pour graphe
# Copie des données pour transfo
df_volume2 = df_filtered.copy()
Expand Down Expand Up @@ -818,6 +805,14 @@ def french_format(x: int) -> str:

nb_collec_top = df_top10["ID_RELEVE"].nunique()

# Message d'avertissement nb de collectes en dessous de 5
if nb_collectes_int <= 5:
st.warning(
"⚠️ Faible nombre de ramassages ("
+ str(nb_collectes_int)
+ ") dans la base de données."
)

# Ligne 1 : 3 cellules avec les indicateurs clés en haut de page
l1_col1, l1_col2 = st.columns(2)
# Pour avoir 3 cellules avec bordure, il faut nester un st.container dans chaque colonne (pas d'option bordure dans st.column)
Expand All @@ -831,14 +826,6 @@ def french_format(x: int) -> str:
cell2 = l1_col2.container(border=True)
cell2.metric("Nombre de ramassages", french_format(nb_collec_top))

# Message d'avertissement nb de collectes en dessous de 5
if nb_collectes_int <= 5:
st.warning(
"⚠️ Le nombre de ramassages "
+ str(nb_collectes_int)
+ " est trop faible pour l'analyse."
)

# Ligne 2 : graphique top déchets

# Filtration sur les type-regroupement selection dechets "GROUPE" uniquement
Expand Down Expand Up @@ -875,37 +862,35 @@ def french_format(x: int) -> str:
color_discrete_map=colors_map,
category_orders={"categorie": df_top10_dechets["categorie"].tolist()},
)
fig5.update_layout(xaxis_type="log")
# suppression de la légende des couleurs

fig5.update_layout(
showlegend=True,
height=700,
uniformtext_minsize=8,
uniformtext_mode="show",
yaxis_title=None,
# Position de la légende
xaxis_type="log", # Echelle logarithmique
showlegend=True, # Afficher la légende
height=700, # Régler la hauteur du graphique
uniformtext_minsize=10, # Taille minimale du texte sur les barres
uniformtext_mode="show", # Règle d'affichage du texte sur les barres
yaxis_title=None, # Cache le titre de l'axe y
legend=dict(
yanchor="bottom",
y=1.01,
xanchor="right",
x=0.95,
),
separators=", ",
), # Règle la position de la légende à partir du point d'ancrage choisi
separators=", ", # Formatte les nombres en français (séparateur décimale, séparateur milliers)
)

# Amélioration du visuel du graphique
fig5.update_traces(
texttemplate="%{text:,.0f}",
textposition="inside",
textfont_color="white",
textfont_size=14,
texttemplate="%{text:,.0f}", # Template du texte sur les barres
textposition="inside", # Position du texte sur les barres
textfont_color="white", # Couleur du texte
textfont_size=14, # Taille du texte
)

fig5.update_yaxes(tickfont=dict(size=14)) # Taille des étiquettes en abcisse

fig5.update_traces(
hovertemplate="%{y} : <b>%{x:,.0f} déchets</b>"
) # Template de l'infobulle
) # Template de l'infobulle, fait référence à x et y définis dans px.bar.

# Suppression de la colonne categorie
del df_top10_dechets["Materiau"]
Expand All @@ -916,8 +901,7 @@ def french_format(x: int) -> str:
st.write("")
st.caption(
f"Note : Les chiffres ci-dessous sont calculés sur {nb_collec_top} ramassages \
ayant fait l’objet d’une estimation des volumes \
par matériau."
ayant fait l’objet d’un comptage par type de déchets, soit {nb_total_dechets:.0f} déchets."
)

with st.container(border=True):
Expand Down Expand Up @@ -1239,16 +1223,22 @@ def french_format(x: int) -> str:
### ANALYSE PAR SECTEUR
st.write("**Analyse par secteur économique** (relevés de niveau 4 uniquement)")

# Message d'avertissement nb de collectes en dessous de 5
if collectes_sect <= 5:
st.warning(
"⚠️ Faible nombre de ramassages ("
+ str(collectes_sect)
+ ") dans la base de données."
)

# Ligne 1 : 3 cellules avec les indicateurs clés en haut de page
l1_col1, l1_col2, l1_col3 = st.columns(3)
# Pour avoir 3 cellules avec bordure, il faut nester un st.container dans chaque colonne (pas d'option bordure dans st.column)
# 1ère métrique : volume total de déchets collectés
cell1 = l1_col1.container(border=True)

# Trick pour séparer les milliers
cell1.metric(
"Quantité de déchets catégorisés", french_format(nb_dechet_secteur)
)
cell1.metric("Nombre de déchets comptés", french_format(nb_dechet_secteur))

# 2ème métrique : poids
cell2 = l1_col2.container(border=True)
Expand All @@ -1264,14 +1254,6 @@ def french_format(x: int) -> str:
french_format(collectes_sect),
)

# Message d'avertissement nb de collectes en dessous de 5
if collectes_sect <= 5:
st.warning(
"⚠️ Faible nombre de ramassages ("
+ str(collectes_sect)
+ ") dans la base de données."
)

# Ligne 2 : 3 cellules avec les indicateurs clés en bas de page
colors_map_secteur = {
"AGRICULTURE": "#156644",
Expand Down Expand Up @@ -1326,6 +1308,7 @@ def french_format(x: int) -> str:
)
fig_secteur.update_layout(
height=700,
uniformtext_minsize=10,
uniformtext_mode="hide",
showlegend=False,
yaxis_title=None,
Expand All @@ -1337,14 +1320,14 @@ def french_format(x: int) -> str:

# Paramétrage de l'infobulle
fig_secteur.update_traces(
hovertemplate="Secteur : <b>%{y}</b><br> Quantité : <b>%{x:,.0f} déchets</b><br> Part du total déchets : <b>%{customdata[0]:.0%}</b>"
hovertemplate="Secteur : <b>%{y}</b><br> Quantité : <b>%{x:,.0f} déchets</b><br> Proportion : <b>%{customdata[0]:.0%}</b>"
)

with st.container(border=True):
st.plotly_chart(fig_secteur, use_container_width=True)

# Message d'avertissement Nombre de dechets dont le secteur n'a pas été determine
if nb_vide_indetermine != 0:
if nb_vide_indetermine != 0 and nb_vide_indetermine != None:
st.caption(
"Note : cette analyse exclut "
+ str(french_format(nb_vide_indetermine))
Expand Down Expand Up @@ -1418,7 +1401,7 @@ def french_format(x: int) -> str:
st.plotly_chart(figreptree, use_container_width=True)

# Message d'avertissement Nombre de déchets dont la REP n'a pas été determine
if nb_vide_indetermine_REP != 0:
if nb_vide_indetermine_REP != 0 and nb_vide_indetermine_REP != None:
st.caption(
"Note : Cette analyse exclut "
+ str(french_format(nb_vide_indetermine_REP))
Expand Down Expand Up @@ -1467,7 +1450,7 @@ def french_format(x: int) -> str:
fig_marque.update_layout(
# xaxis_type="log", # Pas besoin d'échelle log ici
height=700,
uniformtext_minsize=8,
uniformtext_minsize=10,
uniformtext_mode="hide",
yaxis_title=None,
separators=", ",
Expand All @@ -1486,7 +1469,7 @@ def french_format(x: int) -> str:
st.plotly_chart(fig_marque, use_container_width=True)

# Message d'avertissement pour les déchets non catégorisés
if nb_vide_indetermine_marque != None:
if nb_vide_indetermine_marque != None and nb_vide_indetermine_marque != 0:
st.caption(
"Note : cette analyse exclut "
+ str(french_format(nb_vide_indetermine_marque))
Expand Down

0 comments on commit fb43f53

Please sign in to comment.