Gráfico de áreas apiladas en matplotlib con stackplot

Gráfico de áreas apiladas matplotlib con 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()

Gráfico de áreas apiladas en matplotlib

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()

La función stackplot de matplotlib

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()

Gráfico de áreas apiladas en Python con leyenda

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()

Cambiar los colores de un área de gráficas apiladas en matplotlib

Métodos para calcular la línea base (baseline)

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”.

*Gráfico de áreas apiladas simétrico en matplotlib

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.

Streamplot en Python con stackplot

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.

Streamgraph en matplotlib

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()
Storytelling con Datos

Visualización de datos para profesionales

Comprar en Amazon
Data Sketches

A journey of imagination, exploration, and beautiful data visualizations

Comprar en Amazon

También te puede interesar