Skip to content
Snippets Groups Projects
Commit 38982d2c authored by Hu Marilyne's avatar Hu Marilyne
Browse files

update new fonctionnality

parent 3c8b5361
No related branches found
No related tags found
No related merge requests found
# Streamlit Projet
Lien en ligne du logiciel : https://app-project-gem6konsqjctcv2zfkc54v.streamlit.app/
\ No newline at end of file
Arborescance de l'application :
- data : le répertoire contient les données nécessaires au bon fonctionnement du logiciel
- onglets : contient les différents types de graphiques (bar horizontale, etc.)
- utils : contient l'ensemble des fonctions nécessaires au bon fonctionnement de l'application
Ce logiciel a été mis en ligne via Github et accessible à partir de ce lien : https://app-project-gem6konsqjctcv2zfkc54v.streamlit.app/
Une barre de sélection avec un entier correspond au nombre de lignes qu'on affiche dans le graphique à partir des données (compter à partir de la première ligne des données).
Pour pouvoir mettre une couleur de légende, il faut sélectionner la colonne "numero_color" des données de test, qui correspond à l'index des couleurs de chaque barre horizontale. De plus, on peut saisir manuellement le nom de la couleur.
......@@ -5,138 +5,14 @@ from matplotlib.colors import LinearSegmentedColormap, ListedColormap, to_hex
import matplotlib.patches as mpatches
from io import BytesIO
import utils_graph
from utils_graph import plot_graph
import utils.utils_graph as utils_graph
from utils.utils_graph import plot_graph
st.title('Logiciel cartographique')
upload_file = st.file_uploader('Charger vos données en format .csv ou .xlsx.')
if upload_file is not None :
# chargement des données
filename = upload_file.name
# vérifie la forme des données
if filename.endswith('.csv'):
df = pd.read_csv(upload_file)
st.success("Fichier CSV chargé avec succès.")
elif filename.endswith('.xlsx') or filename.endswith('.xls'):
df = pd.read_excel(upload_file)
st.success("Fichier Excel chargé avec succès.")
else:
st.error("Format de fichier non supporté. Veuillez charger un .csv ou un .xlsx.")
# visualisation des données
st.header('Visualisation des données :')
st.write(df.head(5)) # pour 5 lignes
# bloc sur les infos du dataframe
st.subheader('Information sur les données :')
with st.expander("📊 Aperçu du DataFrame"):
st.markdown(f"**Dimensions :** {df.shape[0]} lignes × {df.shape[1]} colonnes")
st.markdown("**Colonnes disponibles :**")
st.write(list(df.columns))
st.markdown("**Types de données :**")
st.write(df.dtypes)
st.subheader('Choix d\'option :')
if df.shape[0]>12 :
nb_line = st.number_input(
"Nombre de lignes à afficher",
min_value=1,
max_value=len(df),
value=5,
step=1,
format="%d" # ← force l'affichage et le retour d'un entier
)
# choix des colonnes à tracer
columns = df.columns.tolist()
col_x = st.selectbox('Choisir la colonne des valeurs (x)', columns)
col_y = st.selectbox('Choisir la colonne des catégories (y)', columns)
title_choice = st.checkbox("Voulez-vous mettre un titre au graphique ?")
if title_choice:
title = st.text_input("Entrez le titre du graphique :", key="title_input")
else:
title = None
from onglets import onglet1
x_choice = st.checkbox("Voulez-vous nommer l'axe des abscisses ?")
if x_choice:
xlabel = st.text_input("Entrez le nom de l'axe des abscisses :", key="xlabel_input")
else:
xlabel = None
y_choice = st.checkbox("Voulez-vous nommer l'axe des ordonnées ?")
if y_choice:
ylabel = st.text_input("Entrez le nom de l'axe des ordonnées :", key="ylabel_input")
else:
ylabel = None
model_graph = utils_graph.plot_graph(df = df.loc[:nb_line-1, :], x = col_x, y = col_y)
legend_choice = st.checkbox('Voulez-vous mettre une légende de couleurs ?')
if legend_choice:
col_color = st.selectbox('Choisir la colonne des numéros de couleurs', columns)
try :
# Premier tracé pour générer list_colors
model_graph.barh_subplot(colors=col_color, show=False, title= title, xlabel= xlabel, ylabel=ylabel)
colors_rgba = model_graph.list_colors
custom_colors = {}
legend_labels = []
legend_indices = []
st.markdown("Personnalisation des couleurs et des légendes :")
for i, rgba in enumerate(colors_rgba):
hex_color = to_hex(rgba)
col1, col2 = st.columns(2)
with col1:
picked_color = st.color_picker(f"Couleur {i+1}", hex_color)
with col2:
label = st.text_input(f"Légende {i+1}", key=f"legend_{i}")
if label.strip(): # légende non vide
legend_labels.append(label)
legend_indices.append(i)
custom_colors[i] = {"color": picked_color, "label": label}
# Retracer avec légendes non vides
barh = model_graph.barh_subplot(
colors=col_color,
legend_list=legend_labels,
title_legend="Légende",
legend_indices=legend_indices,
title= title,
xlabel= xlabel,
ylabel= ylabel
)
st.pyplot(barh)
except Exception as e:
st.warning("⚠️ Cette colonne ne semble pas contenir des numéros de couleurs valides.")
else:
# Tracer sans légende
barh = model_graph.barh_subplot(title= title, xlabel= xlabel, ylabel= ylabel)
st.pyplot(barh)
st.title('Logiciel cartographique')
# Sauvegarde du graphique dans un buffer en mémoire
img_buffer = BytesIO()
barh.savefig(img_buffer, format='png', dpi=300, bbox_inches='tight')
img_buffer.seek(0) # Revenir au début du buffer
option = st.sidebar.selectbox("Choisir le format du graphique :", ("Graphique en barre horizontale","Histogramme"))
# Bouton de téléchargement
st.download_button(
label="📥 Télécharger le graphique",
data=img_buffer,
file_name="mon_graphique.png",
mime="image/png"
)
if option == "Graphique en barre horizontale" :
onglet1.display()
\ No newline at end of file
File added
import streamlit as st
import pandas as pd
from matplotlib.colors import to_hex
from io import BytesIO
import sys
import os
sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..', 'utils')))
import utils.utils_graph as utils_graph
def display() :
upload_file = st.file_uploader('Charger vos données en format .csv ou .xlsx.')
if upload_file is not None :
# chargement des données
filename = upload_file.name
# vérifie la forme des données
if filename.endswith('.csv'):
df = pd.read_csv(upload_file)
st.success("Fichier CSV chargé avec succès.")
elif filename.endswith('.xlsx') or filename.endswith('.xls'):
df = pd.read_excel(upload_file)
st.success("Fichier Excel chargé avec succès.")
else:
st.error("Format de fichier non supporté. Veuillez charger un .csv ou un .xlsx.")
# visualisation des données
st.header('Visualisation des données :')
st.write(df.head(5)) # pour 5 lignes
# bloc sur les infos du dataframe
st.subheader('Information sur les données :')
with st.expander("📊 Aperçu du DataFrame"):
st.markdown(f"**Dimensions :** {df.shape[0]} lignes × {df.shape[1]} colonnes")
st.markdown("**Colonnes disponibles :**")
st.write(list(df.columns))
st.markdown("**Types de données :**")
st.write(df.dtypes)
st.subheader('Choix d\'option :')
if df.shape[0]>12 :
nb_line = st.number_input(
"Nombre de lignes à afficher",
min_value=1,
max_value=len(df),
value=5,
step=1,
format="%d" # ← force l'affichage et le retour d'un entier
)
# choix des colonnes à tracer
columns = df.columns.tolist()
col_x = st.selectbox('Choisir la colonne des valeurs (x)', columns)
col_y = st.selectbox('Choisir la colonne des catégories (y)', columns)
title_choice = st.checkbox("Voulez-vous mettre un titre au graphique ?")
if title_choice:
title = st.text_input("Entrez le titre du graphique :", key="title_input")
else:
title = None
x_choice = st.checkbox("Voulez-vous nommer l'axe des abscisses ?")
if x_choice:
xlabel = st.text_input("Entrez le nom de l'axe des abscisses :", key="xlabel_input")
else:
xlabel = None
y_choice = st.checkbox("Voulez-vous nommer l'axe des ordonnées ?")
if y_choice:
ylabel = st.text_input("Entrez le nom de l'axe des ordonnées :", key="ylabel_input")
else:
ylabel = None
model_graph = utils_graph.plot_graph(df = df.loc[:nb_line-1, :], x = col_x, y = col_y)
legend_choice = st.checkbox('Voulez-vous mettre une légende de couleurs ?')
#annotation = st.checkbox('Voulez-cous mettre une annotation ?')
#if annotation :
# col_nombre = st.selectbox('Colonne des valeurs absolues', columns)
if legend_choice:
col_color = st.selectbox('Choisir la colonne des numéros de couleurs', columns)
try :
# Premier tracé pour générer list_colors
model_graph.barh_subplot(colors=col_color, show=False, title= title, xlabel= xlabel, ylabel=ylabel)
colors_rgba = model_graph.list_colors
custom_colors = {}
legend_labels = []
legend_indices = []
st.markdown("Personnalisation des couleurs et des légendes :")
for i, rgba in enumerate(colors_rgba):
hex_color = to_hex(rgba)
col1, col2 = st.columns(2)
with col1:
picked_color = st.color_picker(f"Couleur {i+1}", hex_color)
with col2:
label = st.text_input(f"Légende {i+1}", key=f"legend_{i}")
if label.strip(): # légende non vide
legend_labels.append(label)
legend_indices.append(i)
custom_colors[i] = {"color": picked_color, "label": label}
# Retracer avec légendes non vides
barh = model_graph.barh_subplot(
colors=col_color,
legend_list=legend_labels,
title_legend="Légende",
legend_indices=legend_indices,
title= title,
xlabel= xlabel,
ylabel= ylabel
)
st.pyplot(barh)
except Exception as e:
st.warning("⚠️ Cette colonne ne semble pas contenir des numéros de couleurs valides.")
else:
# Tracer sans légende
barh = model_graph.barh_subplot(title= title, xlabel= xlabel, ylabel= ylabel)
st.pyplot(barh)
# Sauvegarde du graphique dans un buffer en mémoire
img_buffer = BytesIO()
barh.savefig(img_buffer, format='png', dpi=300, bbox_inches='tight')
img_buffer.seek(0) # Revenir au début du buffer
# Bouton de téléchargement
st.download_button(
label="📥 Télécharger le graphique",
data=img_buffer,
file_name="mon_graphique.png",
mime="image/png"
)
File added
This diff is collapsed.
......@@ -41,7 +41,7 @@ class plot_graph() :
if self.ax is None or self.fig is None or force_new_fig:
self.fig, self.ax = plt.subplots(figsize=self.figsize)
bars = self.ax.barh(self.y, self.x, color = colors_bars, hatch = hatches)
self.bars = self.ax.barh(self.y, self.x, color = colors_bars, hatch = hatches)
if legend_list and colors is not None:
legend_elements = []
......@@ -86,53 +86,29 @@ class plot_graph() :
return self.fig
# partie à revoir selon les besoins des missions
def annotation(self) :
def annotation(self, pourcentage = None, Nombre = None) :
""" # Ajouter des annotations sur les barres
if pourcentage_list == False :
for n, bar in enumerate(bars):
if pourcentage and not Nombre :
for n, bar in enumerate(self.bars) :
width = bar.get_width()
if np.isnan(width):
# Gérer le cas où la largeur est NaN
text = "N/A"
elif nombre and slash :
text = f"{round(width)}/{self.df.loc[n,slash]}"
elif nombre and slash == False :
text = f"{round(width)}"
else:
if pourcentage and self.df.shape[0]<10:
text = f"{round((width / self.df['count'].sum()) * 100, 1)}% ({int(width)})"
elif pourcentage and self.df.shape[0]>=10:
text = f"{round((width / total) * 100, 1)}% ({int(width)})"
else :
text = f"{round(width)}%"
if width == 0 :
ax.text(2 if not np.isnan(width) else 0 , bar.get_y() + bar.get_height() / 2,
text,va='center', ha='left', color='gray', fontsize=9)
else :
ax.text(width * 1.01 if not np.isnan(width) else 0 , bar.get_y() + bar.get_height() / 2,
text = self.df.loc[n,pourcentage]
self.ax.text(width * 1.01 if not np.isnan(width) else 0 , bar.get_y() + bar.get_height() / 2,
text, va='center', ha='left', color='gray', fontsize=9)
elif pourcentage_list != False:
for n,bar in enumerate(bars):
elif Nombre and not pourcentage :
for n, bar in enumerate(self.bars) :
width = bar.get_width()
if np.isnan(width):
# Gérer le cas où la largeur est NaN
text = "N/A"
elif inverse :
text = f"{width}% ({self.df.loc[n,pourcentage_list]})"
else :
text = f"{self.df.loc[n,pourcentage_list]}% ({width})"
if width == 0 :
ax.text(2 if not np.isnan(width) else 0 , bar.get_y() + bar.get_height() / 2,
text,va='center', ha='left', color='gray', fontsize=9)
else :
ax.text(width * 1.01 if not np.isnan(width) else 0 , bar.get_y() + bar.get_height() / 2,
text, va='center', ha='left', color='gray', fontsize=9)"""
text = self.df.loc[n,Nombre]
self.ax.text(width * 1.01 if not np.isnan(width) else 0 , bar.get_y() + bar.get_height() / 2,
text, va='center', ha='left', color='gray', fontsize=9)
pass
elif Nombre and pourcentage :
for n, bar in enumerate(self.bars) :
width = bar.get_width()
text = f'{self.df.loc[n,Nombre]} ({self.df.loc[n,pourcentage]} %)'
self.ax.text(width * 1.01 if not np.isnan(width) else 0 , bar.get_y() + bar.get_height() / 2,
text, va='center', ha='left', color='gray', fontsize=9)
def encadrer(self) :
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment