Intermédiaire

Personnalisation et rendu professionnel

Un graphique brut Plotly Express est fonctionnel, mais rarement prêt pour un dashboard soigné. Cette page couvre les techniques de personnalisation du rendu.

update_layout — la structure du graphique

update_layout() modifie les éléments structurels du graphique : titre, police, couleur de fond, marges, légende, hauteur.

python
fig.update_layout(
    title={"text": "Chiffre d'affaires par région", "font": {"size": 18}},
    font={"family": "Arial", "size": 13},
    plot_bgcolor="rgba(0,0,0,0)",
    paper_bgcolor="rgba(0,0,0,0)",
    margin={"l": 40, "r": 20, "t": 60, "b": 40},
    legend={"orientation": "h", "yanchor": "bottom", "y": -0.3},
    height=400
)

Détail des paramètres :

ParamètreRôle
titleTitre du graphique avec options de style (taille, police, position)
fontPolice par défaut pour tout le graphique
plot_bgcolorCouleur de fond de la zone de traçage (derrière les barres/courbes)
paper_bgcolorCouleur de fond de la zone totale (derrière le titre, la légende)
marginMarges internes (l=gauche, r=droite, t=haut, b=bas)
legendPosition et orientation de la légende
heightHauteur du graphique en pixels

plot_bgcolor vs paper_bgcolor

Ces deux paramètres sont souvent confondus. plot_bgcolor contrôle le fond de la zone où les données sont tracées (le rectangle intérieur). paper_bgcolor contrôle le fond de tout le reste (titre, légende, marges). Pour un rendu transparent dans Streamlit, mettez les deux à "rgba(0,0,0,0)".

Quelle est la différence entre plot_bgcolor et paper_bgcolor dans update_layout() ?

update_traces — les éléments de données

update_traces() modifie l'apparence des éléments de données eux-mêmes : couleur des barres, épaisseur des lignes, format du hover.

Personnaliser les barres

python
fig.update_traces(
    marker_color="#1f77b4",
    marker_line_color="#0a3d62",
    marker_line_width=1.5
)

Ce code applique une couleur de remplissage bleue, un contour bleu foncé et une épaisseur de contour de 1.5 px à toutes les barres.

Personnaliser les lignes

python
fig.update_traces(
    line={"width": 2.5, "dash": "solid"},
    mode="lines+markers"
)

Les valeurs possibles pour dash : "solid", "dot", "dash", "longdash", "dashdot".

Personnaliser le hover

Le hover par défaut affiche les coordonnées x et y. Pour un rendu plus professionnel, utilisez hovertemplate :

python
fig.update_traces(
    hovertemplate="<b>%{x}</b><br>CA : %{y:,.0f} €<extra></extra>"
)

Détail de la syntaxe :

  • %{x} — valeur de l'axe X
  • %{y:,.0f} — valeur de l'axe Y formatée avec séparateur de milliers et 0 décimale
  • <b>...</b> — texte en gras
  • <br> — retour à la ligne
  • <extra></extra> — masque le texte secondaire (trace name) qui apparaît par défaut

hovertemplate

Un hover brut affiche « region=IDF, chiffre_affaires=1250000 ». Avec un template personnalisé, on obtient « IDF — CA : 1 250 000 € ». Peu d'effort, grosse différence de lisibilité.

Que fait la balise <extra></extra> dans un hovertemplate Plotly ?

Couleurs cohérentes

Dans un dashboard avec plusieurs graphiques, la cohérence des couleurs compte. Définissez une palette centralisée et réutilisez-la :

python
COULEURS = {
    "primaire": "#1f77b4",
    "secondaire": "#ff7f0e",
    "positif": "#2ca02c",
    "negatif": "#d62728",
    "palette": ["#1f77b4", "#ff7f0e", "#2ca02c", "#d62728", "#9467bd"]
}

Application sur les graphiques :

python
fig_bar = px.bar(df, x="region", y="ca", color_discrete_sequence=COULEURS["palette"])
fig_line = px.line(df, x="mois", y="ca", color_discrete_sequence=[COULEURS["primaire"]])

color_discrete_sequence

Ce paramètre accepte une liste de couleurs, même pour une seule série. N'oubliez pas les crochets : color_discrete_sequence=[COULEURS["primaire"]] (liste d'un élément), pas color_discrete_sequence=COULEURS["primaire"] (chaîne).

Compatibilité avec le thème Streamlit

Streamlit supporte le mode clair et le mode sombre. Pour que vos graphiques s'intègrent correctement dans les deux modes, deux approches :

Fond transparent (recommandé)

python
fig.update_layout(
    plot_bgcolor="rgba(0,0,0,0)",
    paper_bgcolor="rgba(0,0,0,0)"
)

Le graphique hérite du fond de la page Streamlit, quel que soit le thème.

Template Plotly

Plotly propose des templates prédéfinis qui s'adaptent à différents contextes :

python
fig = px.bar(df, x="region", y="ca", template="plotly_white")

Les templates disponibles : "plotly" (défaut), "plotly_white", "plotly_dark", "simple_white", "ggplot2", "seaborn".

Recommandation

Pour un dashboard Streamlit, fond transparent + police par défaut suffit. Le graphique s'adapte au thème sans code conditionnel. Si vous préférez un template, "plotly_white" est le plus neutre.

Factoriser la personnalisation

Avec plusieurs graphiques, la personnalisation se répète. Factorisez-la dans une fonction :

python
def style_figure(fig, height=400):
    """Applique le style standard à une figure Plotly."""
    fig.update_layout(
        font={"family": "Arial", "size": 13},
        plot_bgcolor="rgba(0,0,0,0)",
        paper_bgcolor="rgba(0,0,0,0)",
        margin={"l": 40, "r": 20, "t": 60, "b": 40},
        height=height
    )
    fig.update_traces(
        hovertemplate="<b>%{x}</b><br>%{y:,.0f}<extra></extra>"
    )
    return fig

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

Quelle est la meilleure approche pour que les graphiques Plotly s'adaptent au mode clair et sombre de Streamlit ?

À retenir

Points clés

  • update_layout() modifie la structure : titre, police, fond, marges, légende, hauteur
  • update_traces() modifie les données : couleurs, épaisseur, hover
  • hovertemplate a un fort impact sur la lisibilité — personnalisez-le systématiquement
  • Définissez une palette de couleurs centralisée et réutilisez-la dans tous les graphiques
  • Fond transparent (rgba(0,0,0,0)) pour s'adapter automatiquement au thème Streamlit
  • Factorisez la personnalisation dans une fonction utilitaire