官术网_书友最值得收藏!

Plotting stacked bar charts

Stacked bar charts are of course possible by using a special parameter from the pyplot.bar() function.

How to do it...

The following script stacks two bar charts on each other:

import matplotlib.pyplot as plt

A = [5., 30., 45., 22.]
B = [5., 25., 50., 20.]

X = range(4)

plt.bar(X, A, color = 'b')
plt.bar(X, B, color = 'r', bottom = A)
plt.show()

The preceding script will produce the following graph:

How to do it...

How it works...

The optional bottom parameter of the pyplot.bar() function allows you to specify a starting value for a bar. Instead of running from zero to a value, it will go from the bottom to value. The first call to pyplot.bar() plots the blue bars. The second call to pyplot.bar() plots the red bars, with the bottom of the red bars being at the top of the blue bars.

There's more...

When stacking more than two set of values, the code gets less pretty as follows:

import numpy as np
import matplotlib.pyplot as plt

A = np.array([5., 30., 45., 22.])
B = np.array([5., 25., 50., 20.])
C = np.array([1.,  2.,  1.,  1.])
X = np.arange(4)

plt.bar(X, A, color = 'b')
plt.bar(X, B, color = 'g', bottom = A)
plt.bar(X, C, color = 'r', bottom = A + B)

plt.show()

For the third bar chart, we have to compute the bottom values as A + B, the coefficient-wise sum of A and B. Using NumPy helps to keep the code compact but readable. This code is, however, fairly repetitive and works for only three stacked bar charts. We can do better using the following code:

import numpy as np
import matplotlib.pyplot as plt

data = np.array([[5., 30., 45., 22.],
  [5., 25., 50., 20.],
  [1.,  2.,  1.,  1.]]

color_list = ['b', 'g', 'r']

X = np.arange(data.shape[1])
for i in range(data.shape[0]):
  plt.bar(X, data[i],
    bottom = np.sum(data[:i], axis = 0),
    color = color_list[i % len(color_list)])

plt.show()

Here, we store the data in a NumPy array, one row for one bar chart. We iterate over each row of data. For the ith row, the bottom parameter receives the sum of all the rows before the ith row. Writing the script this way, we can stack as many bar charts as we wish with minimal effort when changing the input data.

There's more...
主站蜘蛛池模板: 行唐县| 赣榆县| 木兰县| 巴南区| 兰考县| 沭阳县| 霍城县| 纳雍县| 靖安县| 深水埗区| 新乐市| 洪雅县| 泌阳县| 秦安县| 山东省| 卢湾区| 慈溪市| 奉新县| 锦屏县| 龙胜| 公主岭市| 会昌县| 名山县| 桓仁| 肃宁县| 图片| 苏尼特左旗| 阆中市| 桓台县| 神池县| 衡水市| 淮阳县| 铅山县| 呼和浩特市| 东辽县| 南通市| 格尔木市| 乌鲁木齐县| 蒲城县| 双流县| 洪泽县|