python - real - ¿Cómo puedo crear un gráfico de líneas apiladas con matplotlib?
matplotlib python (4)
Creo que la Parcela de área es un término común para este tipo de diagrama, y en el ejemplo específico recitado en el PO, Parcela de área apilada .
Matplotlib no tiene una función "lista para usar" que combine tanto el procesamiento de datos como los pasos de dibujo / renderizado para crear un tipo de diagrama así, pero es fácil hacer los suyos propios de los componentes suministrados por Matplotlib y NumPy.
El siguiente código apila primero los datos, luego dibuja la trama.
import numpy as NP
from matplotlib import pyplot as PLT
# just create some random data
fnx = lambda : NP.random.randint(3, 10, 10)
y = NP.row_stack((fnx(), fnx(), fnx()))
# this call to ''cumsum'' (cumulative sum), passing in your y data,
# is necessary to avoid having to manually order the datasets
x = NP.arange(10)
y_stack = NP.cumsum(y, axis=0) # a 3x10 array
fig = PLT.figure()
ax1 = fig.add_subplot(111)
ax1.fill_between(x, 0, y_stack[0,:], facecolor="#CC6666", alpha=.7)
ax1.fill_between(x, y_stack[0,:], y_stack[1,:], facecolor="#1DACD6", alpha=.7)
ax1.fill_between(x, y_stack[1,:], y_stack[2,:], facecolor="#6E5160")
PLT.show()
Me gustaría poder producir un gráfico de líneas apiladas (similar al método utilizado here ) con Python (preferiblemente usando matplotlib, pero otra biblioteca estaría bien también). ¿Cómo puedo hacer esto?
Esto es similar al ejemplo del gráfico de barras apiladas en su sitio web, excepto que me gustaría que la parte superior de la barra se conecte con un segmento de línea y que se llene el área inferior. Podría ser capaz de aproximar esto disminuyendo las brechas entre barras y usando muchas barras (pero esto parece un truco, y además no estoy seguro de si es posible).
Las versiones más nuevas de matplotlib contienen la función plt.stackplot
, que permite varios diagramas de áreas apiladas diferentes " plt.stackplot
":
import numpy as np
import pylab as plt
X = np.arange(0, 10, 1)
Y = X + 5 * np.random.random((5, X.size))
baseline = ["zero", "sym", "wiggle", "weighted_wiggle"]
for n, v in enumerate(baseline):
plt.subplot(2 ,2, n + 1)
plt.stackplot(X, *Y, baseline=v)
plt.title(v)
plt.axis(''tight'')
plt.show()
Si tienes un marco de datos, es bastante fácil:
df = pd.DataFrame(np.random.rand(10, 4), columns=[''a'', ''b'', ''c'', ''d''])
df.plot.area();
Una forma un poco menos hackish sería usar un gráfico de líneas en primer lugar y matplotlib.pyplot.fill_between
. Para emular el apilamiento tienes que cambiar los puntos por ti mismo.
x = np.arange(0,4)
y1 = np.array([1,2,4,3])
y2 = np.array([5,2,1,3])
# y2 should go on top, so shift them up
y2s = y1+y2
plot(x,y1)
plot(x,y2s)
fill_between(x,y1,0,color=''blue'')
fill_between(x,y1,y2s,color=''red'')