Intermédiaire

Visualisations simples

Streamlit intègre des fonctions de visualisation utilisables avec des DataFrames pandas, sans dépendance externe.

st.bar_chart() -- Graphique en barres

st.bar_chart() compare des catégories. Il attend un DataFrame ou une Series pandas :

python
import streamlit as st
import pandas as pd

df = pd.DataFrame({
    "region": ["IDF", "PACA", "ARA", "Bretagne"],
    "chiffre_affaires": [450000, 320000, 280000, 195000]
})

st.subheader("Chiffre d'affaires par région")
st.bar_chart(
    df.set_index("region")["chiffre_affaires"],
    use_container_width=True
)

set_index() est le point clé : Streamlit utilise l'index du DataFrame comme axe horizontal. Sans set_index(), l'axe afficherait des indices numériques (0, 1, 2, 3) au lieu des noms de régions.

use_container_width

use_container_width=True fait occuper au graphique toute la largeur du conteneur parent.

st.line_chart() -- Graphique en lignes

st.line_chart() visualise des évolutions temporelles. Même principe : l'index sert d'axe horizontal.

python
df_mensuel = pd.DataFrame({
    "mois": ["Jan", "Fév", "Mar", "Avr", "Mai", "Jun"],
    "ventes": [120, 135, 148, 142, 165, 178]
})

st.subheader("Évolution des ventes mensuelles")
st.line_chart(
    df_mensuel.set_index("mois")["ventes"],
    use_container_width=True
)

Pour afficher plusieurs séries sur le même graphique, passez un DataFrame avec plusieurs colonnes :

python
df_multi = pd.DataFrame({
    "mois": ["Jan", "Fév", "Mar", "Avr", "Mai", "Jun"],
    "ventes_2023": [120, 135, 148, 142, 165, 178],
    "ventes_2024": [130, 145, 160, 155, 180, 195]
})

st.line_chart(df_multi.set_index("mois"), use_container_width=True)

Streamlit attribue une couleur par colonne et affiche une légende.

st.area_chart() -- Graphique en aires

st.area_chart() fonctionne comme st.line_chart(), mais remplit la zone sous la courbe :

python
st.area_chart(
    df_mensuel.set_index("mois")["ventes"],
    use_container_width=True
)

Gérer les DataFrames vides

Avant d'afficher un graphique, vérifiez que le DataFrame contient des données. Un DataFrame vide produit un graphique vide sans indication :

python
if not df_regions.empty:
    st.bar_chart(
        df_regions.set_index("region")["chiffre_affaires"],
        use_container_width=True
    )
else:
    st.info("Aucune donnée disponible pour les filtres sélectionnés.")

Toujours vérifier df.empty

Avec des filtres, certaines combinaisons ne retournent aucun résultat. Sans cette vérification, l'utilisateur voit un espace vide sans explication.

Limites des graphiques natifs

Les fonctions st.bar_chart(), st.line_chart() et st.area_chart() sont pratiques pour du prototypage, mais elles ont des limites :

FonctionnalitéGraphiques natifsPlotly (Séance 3)
Titre du graphiqueNon (utiliser st.subheader)Oui, intégré
Labels des axesNon configurablesEntièrement configurables
Info-bulles au survolBasiques (valeur brute)Personnalisables
Types de graphiquesBarres, lignes, airesBarres, lignes, camemberts, scatter, heatmaps...
CouleursAutomatiques, non modifiablesEntièrement personnalisables
AnimationsNonOui

Pour aller plus loin, Plotly via st.plotly_chart() offre un contrôle total :

python
import plotly.express as px

fig = px.bar(df, x="region", y="chiffre_affaires", title="CA par région")
st.plotly_chart(fig, use_container_width=True)

Plotly sera approfondi en Séance 3. Les graphiques natifs suffisent pour un premier dashboard.

Pourquoi utilise-t-on df.set_index('region') avant de passer le DataFrame à st.bar_chart() ?

Quelle est la principale limitation des graphiques natifs Streamlit par rapport à Plotly ?

À retenir

Points clés

  • st.bar_chart(), st.line_chart() et st.area_chart() produisent des graphiques en quelques lignes
  • Utilisez set_index() pour définir l'axe horizontal des graphiques
  • Vérifiez toujours df.empty avant d'afficher un graphique
  • Les graphiques natifs suffisent pour un premier dashboard
  • Pour des visualisations personnalisées (titres, couleurs, interactions), passez à Plotly (Séance 3)