Generar estadísticas clave al pasar el ratón
Tras una reciente demostración de tu trabajo a una persona directiva de la empresa de comercio electrónico, te han pedido crear un panel para este stakeholder. Tener demasiadas visualizaciones y demasiado texto está totalmente descartado.
En su lugar, quieren un panel muy interactivo. Han solicitado un diagrama de dispersión que, al pasar el ratón por encima, muestre algunas estadísticas clave adicionales en un cuadro de texto a la derecha. Esto debe cambiar al pasar el ratón por un nuevo punto del diagrama de dispersión.
Este ejercicio forma parte del curso
Creación de paneles con Dash y Plotly
Instrucciones del ejercicio
- Añade la columna
'Country'al parámetrocustom_datadel diagrama de dispersión debajo de la línea8para que aparezca en la propiedadhoverData. - Crea un callback debajo de la línea
28que conecte la gráficascatter_figcon el elementotext_outputy se active al pasar el ratón por el diagrama de dispersión.
ejercicio interactivo práctico
Prueba este ejercicio completando este código de ejemplo.
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)