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

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...
主站蜘蛛池模板: 莱州市| 庆安县| 安溪县| 静乐县| 宁陵县| 湖南省| 阳原县| 泸溪县| 太保市| 平山县| 建瓯市| 九龙县| 秦安县| 新绛县| 舟山市| 宝山区| 聂拉木县| 洪泽县| 顺昌县| 大兴区| 高邑县| 砚山县| 麻江县| 汉寿县| 莱芜市| 长岭县| 舒兰市| 灌云县| 玉门市| 十堰市| 山东省| 敦煌市| 霞浦县| 贡嘎县| 平遥县| 海阳市| 洛浦县| 吉水县| 通海县| 吴江市| 华容县|