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()
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()
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()
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()
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()
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()
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()
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()
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.
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
.
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()
También te puede interesar