41.4 Formato de los datos de entrada

Una ventaja es que las funciones de px aceptan como entrada diversos formatos: listas, diccionarios, marcos de datos de pandas de forma larga y de forma ancha y arreglos numpy.

En este primer ejemplo, utilicemos datos de juguete que vienen junto con plotly express.

df_larga = px.data.medals_long()
df_larga.rename(columns={'nation': 'País', 'medal': 'Medalla', 'count': 'Cantidad'}, inplace=True)
df_larga
df_ancha = px.data.medals_wide()
df_ancha.rename(columns={'nation': 'País'}, inplace=True)
df_ancha

La primera tiene una estructura usual, como la que se espera de una base de datos, pero plotly entiende también la segunda:

fig8 = px.bar(df_larga, x="País", y="Cantidad", color="Medalla", barmode = "group",
                       title="Entrada según la forma larga",
                       color_discrete_map={'gold':'gold', 'silver':'silver', 'bronze':'goldenrod'})

Si se añade el índice del data frame de pandas, este se puede asociar al hover.

fig9 = px.bar(df_larga, x="País", y="Cantidad", color="Medalla", 
                       barmode = "group",
                       title="Entrada según la forma larga",
                       color_discrete_map={'gold':'gold', 
                       'silver':'silver', 
                       'bronze':'goldenrod'},
                       hover_data=[df_larga.index])
fig10 = px.bar(df_ancha, x="País", y=["gold", "silver", "bronze"], barmode = "group",
                       title="Entrada según la forma ancha", 
                       color_discrete_map={'gold':'gold', 'silver':'silver', 'bronze':'goldenrod'})
# fig.update_layout(legend=dict(title='Medalla'), yaxis_title='Cantidad')

Para arreglar los nombres de las etiquetas del hover se debe corregir agregando los labels. Es causado por la forma ancha:

px.bar(df_ancha, x="País", y=["gold", "silver", "bronze"], barmode = "group",
             title="Entrada según la forma ancha, con etiquetas del hover arregladas",
             color_discrete_map={'gold':'gold', 'silver':'silver', 'bronze':'goldenrod'},
             labels={"value": "Cantidad", "variable": "Medalla"}).update_layout(legend=dict(title='Tipo medalla'), yaxis_title='Cantidad')

Recordemos el primer ejemplo de este cuadernillo:

import pandas as pd df = pd.DataFrame({“Fruta”: [“Pitaya”, “Kiwi”, “Higo”, “Pitaya”, “Kiwi”, “Higo”], “Entrevistado”: [“Alex”, “Alex”, “Alex”, “Jacinto”, “Jacinto”, “Jacinto”], “Puntaje”: [9, 10, 3, 10, 7, 2],})

import plotly.express as px

fig = px.bar(df, x=“Fruta”, y=“Puntaje”, color=“Entrevistado”, barmode=“group”, title=“Realizado mediante plotly Express”)

También acepta las variables como columnas pandas:

import pandas as pd
df = pd.DataFrame({"Fruta": ["Pitaya", "Kiwi", "Higo", "Pitaya", "Kiwi", "Higo"],
  "Entrevistado": ["Alex", "Alex", "Alex", "Jacinto", "Jacinto", "Jacinto"],
  "Puntaje": [9, 10, 3, 10, 7, 2],})
fig12 = px.bar(df, x = df.Fruta, y = df.Puntaje, color = df.Entrevistado, barmode = "group",
             title = "Realizado mediante plotly Express")

Si se añade el índice del data frame de pandas, este se puede asociar al hover.

fig13 = px.bar(df, x = df.Fruta, y = df.Puntaje, color = df.Entrevistado, barmode = "group",
             title = "Realizado mediante plotly Express",
             hover_data=[df.index])

En tanto se tenga la misma cantidad de filas, se puede adicionar información no incorporada en el data frame inicial. Por ejemplo:

df = pd.DataFrame({"Fruta": ["Pitaya", "Kiwi", "Higo", "Pitaya", "Kiwi", "Higo"],
  "Entrevistado": ["Alex", "Alex", "Alex", "Jacinto", "Jacinto", "Jacinto"],
  "Puntaje": [9, 10, 3, 10, 7, 2],})
df2 = pd.DataFrame({"Fecha": ["15-01-2023", "15-01-2023", "17-01-2023", "22-01-2023", "22-01-2023", "23-01-2023"]})

fig14 = px.bar(df, x = df.Fruta, y = df.Puntaje, color = df2.Fecha, barmode = "group",
             title = "Color ajustado por fechas", hover_data = [df.Entrevistado],
             labels = {"color": "Fecha"})

Y, finalmente, un ejemplo pasando datos tipo numpy, útil para visualización científica.

import numpy as np
t = np.linspace(0, 10, 100)
fig15 = px.scatter(x = t, y = np.sin(t),
                 labels={'x': 't', 'y': 'sin(t)'})