Avancé

Pièges et cas limites

Valeurs manquantes, formats de date incohérents, axes qui ne commencent pas à zéro — ces problèmes sont fréquents et peuvent rendre un graphique trompeur ou inutilisable.

Données manquantes (NaN)

Le comportement de Plotly face aux NaN varie selon le type de graphique :

Type de graphiqueComportement avec NaN
Line chartRupture dans la courbe — la ligne s'interrompt
Bar chartBarre absente — pas d'erreur, mais un trou visuel
Pie chartErreur — NaN dans values lève une exception

Pie chart et NaN

Le pie chart est le plus sensible aux données manquantes. Un seul NaN dans la colonne values provoque une erreur. Nettoyez toujours vos données avant de les passer à px.pie().

Stratégies de nettoyage

Supprimer les lignes avec des valeurs manquantes :

python
df = df.dropna(subset=["chiffre_affaires", "region"])

Remplacer les valeurs manquantes par zéro :

python
df["chiffre_affaires"] = df["chiffre_affaires"].fillna(0)

Compléter les mois manquants dans une série temporelle :

python
df_full = pd.date_range("2024-01", "2024-12", freq="MS").to_frame(name="mois")
df_merged = df_full.merge(df_evolution, on="mois", how="left").fillna(0)

Cette technique est importante pour les line charts : sans elle, un mois sans données crée une rupture dans la courbe au lieu d'afficher zéro.

Que se passe-t-il quand un NaN est présent dans la colonne values d'un px.pie() ?

Gérer le DataFrame vide

Quand les filtres ne retournent aucune donnée, le DataFrame est vide. Affichez un message plutôt que de laisser Plotly lever une erreur :

python
if df.empty:
    st.info("Aucune donnée disponible pour les filtres sélectionnés.")
else:
    fig = px.bar(df, x="region", y="chiffre_affaires")
    st.plotly_chart(fig, use_container_width=True)

Toujours vérifier df.empty

C'est un réflexe obligatoire. Chaque graphique doit être précédé d'un test if df.empty. Sans cette vérification, un filtre restrictif peut provoquer une erreur ou un affichage incohérent.

Formats de date

Les dates sont une source fréquente de problèmes. La colonne « mois » peut contenir des chaînes ("2024-01", "janvier 2024"), des objets datetime, ou des entiers. Plotly fonctionne mieux avec des datetime natifs.

Conversion avec pd.to_datetime()

python
df["mois"] = pd.to_datetime(df["mois"])
df["date"] = pd.to_datetime(df["date"])

Formater l'axe X

Après conversion, le format d'affichage sur l'axe X se contrôle ainsi :

python
fig = px.line(df, x="mois", y="chiffre_affaires")
fig.update_xaxes(dtick="M1", tickformat="%b %Y")
  • dtick="M1" — un tick par mois
  • tickformat="%b %Y" — affichage « Jan 2024 », « Fév 2024 », etc.

Formats de date courants

Les formats suivent la syntaxe strftime de Python : %b (mois abrégé), %B (mois complet), %Y (année 4 chiffres), %m (mois numérique), %d (jour). Exemples : "%b %Y" → « Jan 2024 », "%d/%m/%Y" → « 15/01/2024 ».

Pourquoi faut-il convertir les dates avec pd.to_datetime() avant de les passer à Plotly ?

Axes dynamiques

Forcer l'axe Y à commencer à zéro

Par défaut, Plotly ajuste la plage des axes pour maximiser l'espace. Cela peut être trompeur : un bar chart dont l'axe Y commence à 900 000 au lieu de 0 exagère les différences.

python
fig.update_yaxes(rangemode="tozero")

rangemode='tozero'

Pour les bar charts, forcez toujours rangemode="tozero". Un bar chart dont l'axe ne commence pas à zéro est visuellement trompeur — la hauteur des barres ne correspond plus aux proportions réelles. Pour les line charts, c'est un choix selon le contexte.

Trier les catégories

Par défaut, Plotly affiche les catégories dans l'ordre du DataFrame. Pour un classement décroissant :

python
df_sorted = df.sort_values("chiffre_affaires", ascending=False)
fig = px.bar(
    df_sorted,
    x="region",
    y="chiffre_affaires",
    category_orders={"region": df_sorted["region"].tolist()}
)

Le paramètre category_orders force l'ordre d'affichage des catégories sur l'axe.

Rotation des labels et nombre de ticks

Quand les labels sont longs ou nombreux, deux ajustements sont utiles :

python
fig.update_xaxes(tickangle=45)
fig.update_layout(xaxis_nticks=12)
  • tickangle=45 — incline les labels à 45 degrés
  • xaxis_nticks=12 — limite le nombre de ticks affichés

À retenir

Points clés

  • Vérifiez toujours df.empty avant de créer un graphique
  • Les NaN cassent les line charts (ruptures) et font planter les pie charts (erreur)
  • Utilisez pd.to_datetime() pour les colonnes de date — Plotly gère mieux les dates natives
  • Forcez rangemode="tozero" sur les bar charts pour éviter les axes trompeurs
  • category_orders permet de contrôler l'ordre d'affichage des catégories