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 graphique | Comportement avec NaN |
|---|---|
| Line chart | Rupture dans la courbe — la ligne s'interrompt |
| Bar chart | Barre absente — pas d'erreur, mais un trou visuel |
| Pie chart | Erreur — 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 :
df = df.dropna(subset=["chiffre_affaires", "region"])
Remplacer les valeurs manquantes par zéro :
df["chiffre_affaires"] = df["chiffre_affaires"].fillna(0)
Compléter les mois manquants dans une série temporelle :
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 :
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()
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 :
fig = px.line(df, x="mois", y="chiffre_affaires")
fig.update_xaxes(dtick="M1", tickformat="%b %Y")
dtick="M1"— un tick par moistickformat="%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.
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 :
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 :
fig.update_xaxes(tickangle=45)
fig.update_layout(xaxis_nticks=12)
tickangle=45— incline les labels à 45 degrésxaxis_nticks=12— limite le nombre de ticks affichés
À retenir
Points clés
- Vérifiez toujours
df.emptyavant 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_orderspermet de contrôler l'ordre d'affichage des catégories