使用matplotlib创建100%堆积面积图

时间:2013-06-01 17:53:13

标签: python matplotlib stacked-area-chart

我想知道如何在matplotlib中创建100%堆积面积图。在matplotlib页面上,我找不到它的例子。

有人可以告诉我如何实现这一目标吗?

1 个答案:

答案 0 :(得分:18)

实现这一目标的一个简单方法是确保对于每个x值,y值总和为100.

我假设您在数组中组织了y值,如下例所示,即

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

要确保列总数为100,您必须将y数组除以其列总和,然后乘以100.这使得y值跨越0到100,使得“单位” “y轴百分比。如果您希望y轴的值跨越从0到1的间隔,请不要乘以100.

即使您没有如上所述在一个数组中组织y值,原理也是一样的;每个数组中由y值组成的相应元素(例如y1y2等)应总和为100(或1)。

以下代码是评论中链接的example @LogicalKnight的修改版本。

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

这给出了如下所示的输出。

enter image description here