Cree un gráfico de área astackda al 100% con matplotlib

Me preguntaba cómo crear un gráfico de área astackda al 100% en matplotlib. En la página de matplotlib no pude encontrar un ejemplo para ello.

Alguien aquí me puede mostrar cómo lograr eso?

Una forma sencilla de lograr esto es asegurarse de que para cada valor de x, los valores de y se sumn a 100.

Supongo que tiene los valores de y organizados en una matriz como en el siguiente ejemplo, es decir

y = np.array([[17, 19, 5, 16, 22, 20, 9, 31, 39, 8], [46, 18, 37, 27, 29, 6, 5, 23, 22, 5], [15, 46, 33, 36, 11, 13, 39, 17, 49, 17]]) 

Para asegurarse de que los totales de la columna sean 100, debe dividir la matriz y por sus sums de columna, y luego multiplicar por 100. Esto hace que los valores de y se extiendan de 0 a 100, haciendo que la “unidad” del porcentaje del eje y . Si, en cambio, desea que los valores del eje y abarquen el intervalo de 0 a 1, no multiplique por 100.

Incluso si no tiene los valores de y organizados en una matriz como la anterior, el principio es el mismo; los elementos correspondientes en cada matriz que consta de valores y (por ejemplo, y1 , y2 , etc.) deben sumr 100 (o 1).

El siguiente código es una versión modificada del ejemplo @LogicalKnight vinculado en su comentario.

 import numpy as np from matplotlib import pyplot as plt fnx = lambda : np.random.randint(5, 50, 10) y = np.row_stack((fnx(), fnx(), fnx())) x = np.arange(10) # Make new array consisting of fractions of column-totals, # using .astype(float) to avoid integer division percent = y / y.sum(axis=0).astype(float) * 100 fig = plt.figure() ax = fig.add_subplot(111) ax.stackplot(x, percent) ax.set_title('100 % stacked area chart') ax.set_ylabel('Percent (%)') ax.margins(0, 0) # Set margins to avoid "whitespace" plt.show() 

Esto da la salida que se muestra a continuación.

introduzca la descripción de la imagen aquí