Gráfico de radar (radar chart) en plotly

Gráfico de radar en plotly con line_polar

La función line_polar de plotly express permite crear gráficos de radar o spider plots en Python. Para ello tendrás que pasar los valores numéricos al argumento r y los grupos o categorías a theta, tanto como nombres de columna de un data frame o como arrays. Ten en cuenta que puedes establecer line_close como True para dibujar una línea extra entre el primer y último punto, en caso de ser necesario.

import plotly.express as px
import pandas as pd

# Datos de muestra
df = pd.DataFrame(dict(
    valor = [8, 12, 7, 14, 10],
    variable = ['V1', 'V2', 'V3', 'V4', 'V5']))
           
fig = px.line_polar(df, r = 'valor', theta = 'variable', line_close = True)

fig.show()

Marcadores

Por defecto, las líneas se muestran sin puntos, pero puedes añadirlos estableciendo el argumento markers como True.

import plotly.express as px
import pandas as pd

# Datos de muestra
df = pd.DataFrame(dict(
    valor = [8, 12, 7, 14, 10],
    variable = ['V1', 'V2', 'V3', 'V4', 'V5']))
           
fig = px.line_polar(df, r = 'valor', theta = 'variable', line_close = True,
                    markers = True)

fig.show()

Colorear las áreas

Es posible colorear el área dentro de las líneas estableciendo el argumento fill de la función update_traces como 'toself'.

import plotly.express as px
import pandas as pd

# Datos de muestra
df = pd.DataFrame(dict(
    valor = [8, 12, 7, 14, 10],
    variable = ['V1', 'V2', 'V3', 'V4', 'V5']))
           
fig = px.line_polar(df, r = 'valor', theta = 'variable', line_close = True)
fig.update_traces(fill = 'toself')

fig.show()

Etiquetas

La función line_polar incluye un argumento llamado text en el que puedes pasar un array o el nombre de una columna de un data frame para agregar etiquetas a cada punto. Además, puedes personalizar la posición de las etiquetas con textposition. En el ejemplo siguiente estamos utilizando los valores como etiquetas.

import plotly.express as px
import pandas as pd

# Datos de muestra
df = pd.DataFrame(dict(
    valor = [8, 12, 7, 14, 10],
    variable = ['V1', 'V2', 'V3', 'V4', 'V5']))
           
fig = px.line_polar(df, r = 'valor', theta = 'variable', line_close = True,
                    text = 'valor')
fig.update_traces(fill = 'toself', textposition = 'top center')

fig.show()

Color

El color azul por defecto de plotly se puede personalizar pasando un color dentro de un array al argumento color_discrete_sequence, como se muestra a continuación.

import plotly.express as px
import pandas as pd

# Datos de muestra
df = pd.DataFrame(dict(
    valor = [8, 12, 7, 14, 10],
    variable = ['V1', 'V2', 'V3', 'V4', 'V5']))
           
fig = px.line_polar(df, r = 'valor', theta = 'variable', line_close = True,
                    color_discrete_sequence = ['red'])
fig.update_traces(fill = 'toself')

fig.show()

Tipo de línea

El tipo de línea se puede personalizar haciendo uso del argumento line_dash_sequence. Tendrás que pasar un array con un único elemento especificando el tipo de línea deseada.

import plotly.express as px
import pandas as pd

# Datos de muestra
df = pd.DataFrame(dict(
    valor = [8, 12, 7, 14, 10],
    variable = ['V1', 'V2', 'V3', 'V4', 'V5']))
           
fig = px.line_polar(df, r = 'valor', theta = 'variable', line_close = True,
                    line_dash_sequence = ['dash'])

fig.show()

Gráfico de radar con varios grupos

Grupos con colores diferentes

Es posible crear un gráfico de radar por grupo o por individuo con la función line_polar. Tendrás que tener tus datos divididos en varios grupos, individuos o categorías y luego podrás pasar la variable categórica a color. En el data frame de muestra del ejemplo siguiente las cinco primeras filas corresponden al primer grupo mientras que las cinco últimas corresponden al segundo.

import plotly.express as px
import pandas as pd

# Datos de muestra
df = pd.DataFrame(dict(
    valor = [8, 12, 7, 14, 10,
             12, 8, 13, 6, 5],
    variable = ['V1', 'V2', 'V3', 'V4', 'V5',
               'V1', 'V2', 'V3', 'V4', 'V5'],
    grupo = ['A', 'A', 'A', 'A', 'A',
            'B', 'B', 'B', 'B', 'B']))
           
fig = px.line_polar(df, r = 'valor', theta = 'variable', line_close = True,
                    color = 'grupo')
fig.update_traces(fill = 'toself')

fig.show()

Ten en cuenta que puedes personalizar el color para cada grupo. Existen dos posibles opciones: pasar un array con tantos colores como grupos a color_discrete_sequence o pasar un diccionario a color_discrete_map especificando el color para cada grupo como en el ejemplo siguiente.

import plotly.express as px
import pandas as pd

# Datos de muestra
df = pd.DataFrame(dict(
    valor = [8, 12, 7, 14, 10,
             12, 8, 13, 6, 5],
    variable = ['V1', 'V2', 'V3', 'V4', 'V5',
               'V1', 'V2', 'V3', 'V4', 'V5'],
    grupo = ['A', 'A', 'A', 'A', 'A',
            'B', 'B', 'B', 'B', 'B']))
           
fig = px.line_polar(df, r = 'valor', theta = 'variable', line_close = True,
                    color = 'grupo', color_discrete_map = {'A': 'dodgerblue', 'B': 'gold'})
fig.update_traces(fill = 'toself')

fig.show()

Grupos con tipos de línea diferentes

Una alternativa a lo anterior es crear un gráfico de radar en el que cada grupo tendrá un tipo de línea diferente. Para ello tendrás que pasar la variable categórica que represente los grupos a line_dash. Puedes personalizar el estilo de línea para cada grupo con line_dash_sequence o con line_dash_map.

import plotly.express as px
import pandas as pd

# Datos de muestra
df = pd.DataFrame(dict(
    valor = [8, 12, 7, 14, 10,
             12, 8, 13, 6, 5],
    variable = ['V1', 'V2', 'V3', 'V4', 'V5',
               'V1', 'V2', 'V3', 'V4', 'V5'],
    grupo = ['A', 'A', 'A', 'A', 'A',
            'B', 'B', 'B', 'B', 'B']))
           
fig = px.line_polar(df, r = 'valor', theta = 'variable', line_close = True,
                    line_dash = 'grupo')

fig.show()
Storytelling con Datos

Visualización de datos para profesionales

Comprar en Amazon
Better Data Visualizations

A Guide for Scholars, Researchers, and Wonks

Comprar en Amazon

También te puede interesar