Create a 100 % stacked area chart with matplotlib

匿名 (未验证) 提交于 2019-12-03 02:20:02

问题:

I was wondering how to create a 100 % stacked area chart in matplotlib. At the matplotlib page I couldn't find an example for it.

Somebody here can show me how to achieve that?

回答1:

A simple way to achieve this is to make sure that for every x-value, the y-values sum to 100.

I assume that you have the y-values organized in an array as in the example below, i.e.

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

To make sure the column totals are 100, you have to divide the y array by its column sums, and then multiply by 100. This makes the y-values span from 0 to 100, making the "unit" of the y-axis percent. If you instead want the values of the y-axis to span the interval from 0 to 1, don't multiply by 100.

Even if you don't have the y-values organized in one array as above, the principle is the same; the corresponding elements in each array consisting of y-values (e.g. y1, y2 etc.) should sum to 100 (or 1).

The below code is a modified version of the example @LogicalKnight linked to in his comment.

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

This gives the output shown below.



标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!