Gráficos sunburst en plotly

Gráficos sunburst en plotly con px.sunburst

Los gráficos sunburst, en ocasiones llamados gráficos de estallido solar, de rayos de sol o de proyección solar, son similares a los treemaps y se utilizan para visualizar datos a través de anillos concéntricos a diferentes niveles de jerarquía. La función para crear gráficos sunburst en plotly express se llama sunburst y tendrás que pasar las categorías a names, sus padres a parents y los valores asociados a cada grupo a values.

import plotly.express as px

data = dict(
    categorias = ['A', 'B', 'C',
                  'A1', 'A2', 'A3',
                  'B1', 'B2', 
                  'C1', 'C2', 'C3'],
    padre = [ '', '', '', 'A', 'A', 'A', 'B', 'B', 'C', 'C', 'C'],
    valor = [35, 25, 40, 10, 15, 10, 12, 13, 10, 20, 10])

fig = px.sunburst(data,
                  names = 'categorias',
                  parents = 'padre',
                  values = 'valor')
    
fig.show()

Haz click en una categoría padre (A, B o C en el ejemplo anterior) para ver una animación que mostará las hojas solo para esa ategoría. Haz click otra vez para volver al gráfico por defecto.

El argumento branchvalues

Puede que hayas observado que a pesar de que la suma de los grupos del segundo nivel es igual a la de suma de valores del primer grupo de niveles no ocupan toda el área que deberían. Esto se debe a que por defecto el argumento branchvalues se establece como 'remainder'. Cuando se establece como 'total', la suma de valores se basa en los padres, mientras que con 'remainder' los valores se toman en cuenta como una parte extra.

import plotly.express as px

data = dict(
    categorias = ['A', 'B', 'C',
                  'A1', 'A2', 'A3',
                  'B1', 'B2', 
                  'C1', 'C2', 'C3'],
    padre = [ '', '', '', 'A', 'A', 'A', 'B', 'B', 'C', 'C', 'C'],
    valor = [35, 25, 40, 10, 15, 10, 12, 13, 10, 20, 10])

fig = px.sunburst(data,
                  names = 'categorias',
                  parents = 'padre',
                  values = 'valor',
                  branchvalues = 'total')
    
fig.show()

Grupo central

Ten en cuenta que el primer nivel del sunburst puede ser un grupo central que contenga al resto. Para ello tendrás que crear una nueva categoría que no tenga padres. Esta categoría debe ser la única que no tenga padre.

import plotly.express as px

data = dict(
    categorias = ['Total', 'A', 'B', 'C',
                  'A1', 'A2', 'A3',
                  'B1', 'B2', 
                  'C1', 'C2', 'C3'],
    padre = ['', 'Total', 'Total', 'Total', 'A', 'A', 'A', 'B', 'B', 'C', 'C', 'C'],
    valor = [100, 35, 25, 40, 10, 15, 10, 12, 13, 10, 20, 10])

fig = px.sunburst(data,
                  names = 'categorias',
                  parents = 'padre',
                  values = 'valor',
                  branchvalues = 'total')
    
fig.show()

Personalización del color

Existen varias formas de personalizar el color de un sunburst. Por defecto, los colores se asignan en base a las categorías del primer anillo. Sin embargo, puedes pasar una variable categórica o numérica a color, de modo que el sunburst se coloreará en base a esa variable con una paleta de colores discreta o continua, según sea el caso.

También puedes personalizar la paleta de colores, pasando un array de colores a color_discrete_sequence o pasando un diccionario a color_discrete_map. Ten en cuenta que puedes pasar un único color al array, de forma que se utilizará una paleta de colores basada en ese color.

import plotly.express as px

data = dict(
    categorias = ['Total', 'A', 'B', 'C',
                  'A1', 'A2', 'A3',
                  'B1', 'B2', 
                  'C1', 'C2', 'C3'],
    padre = ['', 'Total', 'Total', 'Total', 'A', 'A', 'A', 'B', 'B', 'C', 'C', 'C'],
    valor = [100, 35, 25, 40, 10, 15, 10, 12, 13, 10, 20, 10])

fig = px.sunburst(data,
                  names = 'categorias',
                  parents = 'padre',
                  values = 'valor',
                  color_discrete_sequence = ['orange'],
                  branchvalues = 'total')
    
fig.show()

Personalización avanzada

Los gráficos de plotly son muy fáciles de personalizar mediante update_traces. En este caso con las sunburst traces puedes personalizar ajustes de manera avanzada. En el siguiente ejemplo establecemos una fuente de tamaño mínimo de 20 y si la etiqueta no entra se ocultará.

import plotly.express as px

data = dict(
    categorias = ['Total', 'A', 'B', 'C',
                  'A1', 'A2', 'A3',
                  'B1', 'B2', 
                  'C1', 'C2', 'C3'],
    padre = ['', 'Total', 'Total', 'Total', 'A', 'A', 'A', 'B', 'B', 'C', 'C', 'C'],
    valor = [100, 35, 25, 40, 10, 15, 10, 12, 13, 10, 20, 10])

fig = px.sunburst(data,
                  names = 'categorias',
                  parents = 'padre',
                  values = 'valor',
                  branchvalues = 'total')
fig.update_layout(uniformtext = dict(minsize = 20, mode = 'hide'))   

fig.show()

Sunburst a partir de un data frame rectangular

Si tienes un data frame rectangular, puedes utilizarlo para crear un gráfico sunburst sin tener que especificar los nombres y los padres. En este escenario tendrás que utilizar el argumento path y especificar los nombres de columna de las variables que quieras utilizar.

import plotly.express as px

# Datos de muestra
df = px.data.tips()

fig = px.sunburst(df,
                  path = ['sex', 'day', 'time'],
                  values = 'total_bill')
    
fig.show()

Color en base a una variable categórica

Recuerda que puedes establecer el color para cada sección en base a una variable categórica. En el siguiente ejemplo establecemos la columna day como la variable a ser usada para determinar los colores.

import plotly.express as px

# Datos de muestra
df = px.data.tips()

fig = px.sunburst(df,
                  path = ['sex', 'day', 'time'],
                  color = 'day')
    
fig.show()

Color en base a una variable continua

También puedes establecer los colores en base a una variable numérica. Por ejemplo, en el siguiente ejemplo establecemos la columna tip y de esta forma podemos observar, por ejemplo, que en la muestra las mujeres son las que dan más propina los domingos en la cena.

import plotly.express as px

# Datos de muestra
df = px.data.tips()

fig = px.sunburst(df,
                  path = ['sex', 'day', 'time'],
                  color = 'tip')
    
fig.show()
Data Sketches

A journey of imagination, exploration, and beautiful data visualizations

Comprar en Amazon
Better Data Visualizations

A Guide for Scholars, Researchers, and Wonks

Comprar en Amazon

También te puede interesar