stackplot
Al utilizar matplotlib, la función stackplot
te premitirá crear gráficos de áreas apiladas en Python. La función tiene dos formas de recibir datos. La primera ellas toma la forma stackplot(x, y)
, siendo x
un array con los valores para el eje X e y
un array multidimensional que representa los valores sin apilar para cada serie. La segunda toma la forma stackplot(x, y1, y2, ..., yn)
donde en este caso y1, y2, ..., yn
son los arrays individuales sin apilar para cada serie, siendo n
es el número de series o áreas. Mira el ejemplo siguiente a modo aclaratorio.
import numpy as np
import matplotlib.pyplot as plt
# Datos
x = np.arange(2015, 2021, 1)
serie1 = [2, 3, 5, 3, 5, 6]
serie2 = [1, 3, 5, 2, 5, 3]
serie3 = [4, 1, 2, 4, 6, 1]
y = np.vstack([serie1, serie2, serie3])
# Gráfico de áreas apiladas
fig, ax = plt.subplots()
ax.stackplot(x, y)
# Equivalente a:
# ax.stackplot(x, serie1, serie2, serie3)
# plt.show()
Límites de los ejes
Puede que hayas notado que las áreas no están pegadas a los laterales de la caja del gráfico. Si quieres, puedes modificar los límitres de los ejes de la siguiente manera para eliminar los huecos.
import numpy as np
import matplotlib.pyplot as plt
# Datos
x = np.arange(2015, 2021, 1)
serie1 = [2, 3, 5, 3, 5, 6]
serie2 = [1, 3, 5, 2, 5, 3]
serie3 = [4, 1, 2, 4, 6, 1]
y = np.vstack([serie1, serie2, serie3])
# Gráfico de áreas apiladas
fig, ax = plt.subplots()
ax.stackplot(x, y)
# Establecer los límites del eje X y las marcas
ax.set(xlim = (min(x), max(x)), xticks = x)
plt.show()
Agregar una leyenda
Ten en cuenta que la función stackplot
proporciona un argumento llamado labels
. Puedes pasar un array de etiquetas para cada área con este argumento en caso de querer agregar una leyenda al gráfico con ax.legend
.
import numpy as np
import matplotlib.pyplot as plt
# Datos
x = np.arange(2015, 2021, 1)
serie1 = [2, 3, 5, 3, 5, 6]
serie2 = [1, 3, 5, 2, 5, 3]
serie3 = [4, 1, 2, 4, 6, 1]
y = np.vstack([serie1, serie2, serie3])
# Gráfico de áreas apiladas
fig, ax = plt.subplots()
ax.stackplot(x, y, labels = ["G1", "G2", "G3"])
ax.legend(loc = 'upper left')
# Límites de los ejes
ax.set(xlim = (min(x), max(x)), xticks = x)
# plt.show()
Personalización del color
El argumento colors
puede usarse para modificar la paleta de colores por defecto del gráfico de áreas. Puedes pasar tantos colores como áreas tenga tu gráfico, como en el ejemplo siguiente. Recuerda que también puedes modificar la transparencia de las áreas con alpha
.
import numpy as np
import matplotlib.pyplot as plt
# Datos
x = np.arange(2015, 2021, 1)
serie1 = [2, 3, 5, 3, 5, 6]
serie2 = [1, 3, 5, 2, 5, 3]
serie3 = [4, 1, 2, 4, 6, 1]
y = np.vstack([serie1, serie2, serie3])
# Array of colors
cols = ['#FDF5E6', '#FFEBCD', '#DEB887']
# Gráfico de áreas apiladas
fig, ax = plt.subplots()
ax.stackplot(x, y, labels = ["G1", "G2", "G3"],
colors = cols, alpha = 0.9)
# Legend
ax.legend(loc = 'upper left')
# Límites de los ejes
ax.set(xlim = (min(x), max(x)), xticks = x)
plt.show()
La función stackplot
proporciona varios métodos para personalizar la línea base. Por defecto, la línea base se sitúa en cero, esto es, baseline = 'zero'
.
Gráfico de áreas apiladas simétrico en cero (ThemeRiver)
Estableciendo baseline = 'sym'
se creará un gráfico de áreas apiladas centrado en cero. Este tipo de gráfico se conoce en ocasiones como “ThemeRiver”.
import numpy as np
import matplotlib.pyplot as plt
# Datos
x = np.arange(2015, 2021, 1)
serie1 = [2, 3, 5, 3, 5, 6]
serie2 = [1, 3, 5, 2, 5, 3]
serie3 = [4, 1, 2, 4, 6, 1]
y = np.vstack([serie1, serie2, serie3])
# Gráfico de áreas apiladas
fig, ax = plt.subplots()
ax.stackplot(x, y, baseline = 'sym')
# Límites de los ejes
ax.set(xlim = (min(x), max(x)), xticks = x)
# plt.show()
Wiggle
El método 'wiggle'
minimiza la suma de las pendientes al cuadrado.
import numpy as np
import matplotlib.pyplot as plt
# Datos
x = np.arange(2015, 2021, 1)
serie1 = [2, 3, 5, 3, 5, 6]
serie2 = [1, 3, 5, 2, 5, 3]
serie3 = [4, 1, 2, 4, 6, 1]
y = np.vstack([serie1, serie2, serie3])
# Gráfico de áreas apiladas
fig, ax = plt.subplots()
ax.stackplot(x, y, baseline = 'wiggle')
# Límites de los ejes
ax.set(xlim = (min(x), max(x)), xticks = x)
# plt.show()
weighted_wiggle (streamgraph)
Por último, el método 'weighted_wiggle'
es el mismo que el método 'wiggle'
pero tiene en cuenta el tamaño de cada área. Este tipo de gráfico también se llama streamgraph o streamplot.
import numpy as np
import matplotlib.pyplot as plt
# Datos
x = np.arange(2015, 2021, 1)
serie1 = [2, 3, 5, 3, 5, 6]
serie2 = [1, 3, 5, 2, 5, 3]
serie3 = [4, 1, 2, 4, 6, 1]
y = np.vstack([serie1, serie2, serie3])
# Gráfico de áreas apiladas
fig, ax = plt.subplots()
ax.stackplot(x, y, baseline = 'weighted_wiggle')
# Límites de los ejes
ax.set(xlim = (min(x), max(x)), xticks = x)
# plt.show()
También te puede interesar