Gráficos de violín en matplotlib con violinplot

La función violinplot de matplotlib

En matplotlib existe la función violinplot, que permite crear gráficos de violín de manera muy sencilla, tal y como se muestra en el ejemplo siguiente.

import numpy as np
import matplotlib.pyplot as plt

# Semilla para reproducibilidad
np.random.seed(5)

# Simulación de datos
x = np.random.normal(0, 2, 100)

# Gráfico de violín
fig, ax = plt.subplots()
ax.violinplot(x)
# plt.show()

Violin plot en matplotlib

Gráfico de violín horizontal

Los gráficos de violín creados con matplotlib son verticales por defecto. Estableciendo vert = False los gráficos de violín se dibujarán en modo horizontal en lugar de vertical.

import numpy as np
import matplotlib.pyplot as plt

# Semilla para reproducibilidad
np.random.seed(5)

# Simulación de datos
x = np.random.normal(0, 2, 100)

# Gráfico de violín
fig, ax = plt.subplots()
ax.violinplot(x, vert = False)
# plt.show()

Gráfico de violín horizontal en Python con matplotlib

Eliminar los bigotes (extremos)

Estableciendo el argumento showextrema como False podemos eliminar las líneas que representan los valores extremos de los datos.

import numpy as np
import matplotlib.pyplot as plt

# Semilla para reproducibilidad
np.random.seed(5)

# Simulación de datos
x = np.random.normal(0, 2, 100)

# Gráfico de violín
fig, ax = plt.subplots()
ax.violinplot(x, showextrema = False)

# plt.show()

Eliminar las líneas que representan los valores extremos de un gráfico de violín en Python

Color de borde y de fondo

Por defecto, el fondo y el color de borde del área de las funciones de densidad (el violín) son azules por defecto. Para modificar estos colores tendrás que acceder al elemento bodies del diccionario que devuelve el gráfico y establecer los nuevos colores con set_facecolor, set_edgecolor o personalizar la transparencia con set_alpha, tal y como se puede observar en el siguiente bloque de código.

import numpy as np
import matplotlib.pyplot as plt

# Semilla para reproducibilidad
np.random.seed(5)

# Simulación de datos
x = np.random.normal(0, 2, 100)

# Gráfico de violín
fig, ax = plt.subplots()
violin = ax.violinplot(x)

for pc in violin["bodies"]:
    pc.set_facecolor("green")
    pc.set_edgecolor("black")
    pc.set_alpha(0.5)

# plt.show()

Cambiar el color de fondo y la transparencia de un gráfico de violín en matplotlib con Python

Agregar la media y la mediana

Es posible mostrar líneas representando la media y/o la mediana de los datos, tan solo estableciendo los argumentos showmeans y/o showmedians como True, respectivamente.

import numpy as np
import matplotlib.pyplot as plt

# Semilla para reproducibilidad
np.random.seed(5)

# Simulación de datos
x = np.random.normal(0, 2, 100)

# Gráfico de violín
fig, ax = plt.subplots()
ax.violinplot(x, showmeans = True, showmedians = True)

# plt.show()

Cómo agregar la media o la mediana a un gráfico de violín en matplotlib

Agregar cuantiles

La función violinplot también proporciona un argumento llamado quantiles para agregar los cuantiles que desees. Tendrás que pasar un array a ese argumento con valores entre 0 y 1.

import numpy as np
import matplotlib.pyplot as plt

# Semilla para reproducibilidad
np.random.seed(5)

# Simulación de datos
x = np.random.normal(0, 2, 100)

# Gráfico de violín
fig, ax = plt.subplots()
ax.violinplot(x, quantiles = [0.25, 0.5, 0.75])
# plt.show()

Cómo agregar cuantiles a un gráfico de violín en Python

Color de las líneas

Todas las líneas del gráfico se pueden personalizar, tanto los bigotes, como la media, la mediana o los cuantiles. De manera equivalente a cambiar el color de fondo, puedes acceder a los diferentes elementos devueltos por el gráfico ('cbars', 'cmins', 'cmaxes', 'cmeans', 'cmedians' o 'cquantiles') para personalizar las líneas. En el ejemplo siguiente estamos estableciendo todas las líneas con el mismo estilo.

import numpy as np
import matplotlib.pyplot as plt

# Semilla para reproducibilidad
np.random.seed(5)

# Simulación de datos
x = np.random.normal(0, 2, 100)

# Gráfico de violín
fig, ax = plt.subplots()
violin = ax.violinplot(x, showmeans = True, showmedians = True)

for partname in ('cbars', 'cmins', 'cmaxes', 'cmeans', 'cmedians'):
    vp = violin[partname]
    vp.set_edgecolor("red")
    vp.set_linewidth(1)

# plt.show()

Cómo cambiar el color de los extremos de un gráfico de violín hecho con matplotlib y Python

Ten en cuenta que es posible personalizar cada línea de manera independiente. En el ejemplo siguiente estamos estableciendo un color para los bigotes (rojo) y otro para la media y la mediana (verde), tan solo accediendo a los elementos que queramos cada vez.

import numpy as np
import matplotlib.pyplot as plt

# Semilla para reproducibilidad
np.random.seed(5)

# Simulación de datos
x = np.random.normal(0, 2, 100)

# Gráfico de violín
fig, ax = plt.subplots()
violin = ax.violinplot(x, showmeans = True, showmedians = True)

for partname in ('cbars', 'cmins', 'cmaxes'):
    vp = violin[partname]
    vp.set_edgecolor("red")
    vp.set_linewidth(1)

for partname in ('cmeans', 'cmedians'):
    vp = violin[partname]
    vp.set_edgecolor("green")
    vp.set_linewidth(1)   

# plt.show()

Cambiar los colores de la media y la mediana de un violin plot en Python

Gráficos de violín por grupo

Con la misma función que en los ejemplos anteriores también puedes crear gráficos de violín por grupo en matplotlib. La única diferencia son los datos de entrada que se pasan a la función.

Gráfico de violín por grupo en matplotlib

import numpy as np
import matplotlib.pyplot as plt

# Semilla para reproducibilidad
np.random.seed(5)

# Simulación de datos (tres grupos)
X = np.random.normal((2, 4, 6), (1, 1.2, 0.5), (300, 3))

# Gráfico de violín por grupo
fig, ax = plt.subplots()
ax.violinplot(X)
# plt.show()

Cambiar el orden de los grupos

Por último, en caso de gráficos de violín con varios grupos es posible modificar el orden por defecto de los mismos pasando un array con el nuevo orden al argumento positions de la función violinplot.

Modificar el orden o la posición de un violín por grupo en matplotlib

import numpy as np
import matplotlib.pyplot as plt

# Semilla para reproducibilidad
np.random.seed(5)

# Simulación de datos (tres grupos)
X = np.random.normal((2, 4, 6), (1, 1.2, 0.5), (300, 3))

# Gráfico de violín por grupo
fig, ax = plt.subplots()
ax.violinplot(X, positions = [2, 1, 3])
# plt.show()
Better Data Visualizations

A Guide for Scholars, Researchers, and Wonks

Comprar en Amazon
Storytelling con Datos

Visualización de datos para profesionales

Comprar en Amazon

También te puede interesar