Afficher des statistiques clés au survol
Après une démonstration récente de votre travail à une responsable de l’entreprise d’e-commerce, vous avez reçu une demande de créer un tableau de bord pour cette partie prenante. Avoir trop de visualisations et trop de texte est strictement interdit.
À la place, ils souhaitent un tableau de bord très interactif. Ils demandent un nuage de points qui, au survol, affiche des statistiques clés supplémentaires dans une zone de texte à droite. Le contenu doit changer lorsque vous survolez un nouveau point du nuage de points.
Cet exercice fait partie du cours
<cours>Créer des tableaux de bord avec Dash et Plotly</cours>Instructions de l’exercice
- Ajoutez la colonne
'Country'au paramètrecustom_datadu nuage de points sous la ligne8afin qu’elle apparaisse dans la propriétéhoverData. - Créez un callback sous la ligne
28qui relie le graphiquescatter_figà l’élémenttext_outputet qui sera déclenché lors du survol du nuage de points.
Exercice interactif pratique
Essayez cet exercice en complétant ce code d’exemple.
from dash import Dash, dcc, html, Input, Output, callback
import plotly.express as px
import pandas as pd
ecom_sales = pd.read_csv('/usr/local/share/datasets/ecom_sales.csv')
logo_link = 'https://assets.datacamp.com/production/repositories/5893/datasets/fdbe0accd2581a0c505dab4b29ebb66cf72a1803/e-comlogo.png'
ecom_country = ecom_sales.groupby('Country')['OrderValue'].agg(['sum', 'count']).reset_index().rename(columns={'count':'Sales Volume', 'sum':'Total Sales ($)'})
# Add the country data to the scatter plot
ecom_scatter = px.scatter(ecom_country, x='Total Sales ($)', y='Sales Volume', color='Country', width=350, height=400, ____=['____'])
ecom_scatter.update_layout({'legend':dict(orientation='h', y=-0.5,x=1, yanchor='bottom', xanchor='right'), 'margin':dict(l=20, r=20, t=25, b=0)})
app = Dash()
app.layout = [
html.Img(src=logo_link, style={'margin':'30px 0px 0px 0px' }),
html.H1('Sales breakdowns'),
html.Div([
html.H2('Sales by Country'),
dcc.Graph(id='scatter_fig', figure=ecom_scatter)],
style={'width':'350px', 'height':'500px', 'display':'inline-block',
'vertical-align':'top', 'border':'1px solid black', 'padding':'20px'}),
html.Div([
html.H2('Key Stats'),
html.P(id='text_output', style={'width':'500px', 'text-align':'center'})],
style={'width':'700px', 'height':'650px','display':'inline-block'})
]
# Trigger callback on hover
@callback(
Output('text_output', 'children'),
____('scatter_fig', '____'))
def get_key_stats(hoverData):
if not hoverData:
return 'Hover over a country to see key stats'
country = hoverData['points'][0]['customdata'][0]
country_df = ecom_sales[ecom_sales['Country'] == country]
top_major_cat = country_df.groupby('Major Category').agg('size').reset_index(name='Sales Volume').sort_values(by='Sales Volume', ascending=False).reset_index(drop=True).loc[0,'Major Category']
top_sales_month = country_df.groupby('Year-Month')['OrderValue'].agg('sum').reset_index(name='Total Sales ($)').sort_values(by='Total Sales ($)', ascending=False).reset_index(drop=True).loc[0,'Year-Month']
stats_list = [
f'Key stats for : {country}', html.Br(),
f'The most popular Major Category by sales volume was: {top_major_cat}', html.Br(),
f'The highest sales value month was: {top_sales_month}'
]
return stats_list
if __name__ == '__main__':
app.run(debug=True)