|
3 | 3 | Barchart |
4 | 4 | ======== |
5 | 5 |
|
6 | | -A bar plot with errorbars and height labels on individual bars |
| 6 | +A bar plot with errorbars and height labels on individual bars. |
7 | 7 | """ |
8 | 8 | import numpy as np |
9 | 9 | import matplotlib.pyplot as plt |
10 | 10 |
|
11 | | -N = 5 |
12 | | -men_means = (20, 35, 30, 35, 27) |
13 | | -men_std = (2, 3, 4, 1, 2) |
| 11 | +men_means, men_std = (20, 35, 30, 35, 27), (2, 3, 4, 1, 2) |
| 12 | +women_means, women_std = (25, 32, 34, 20, 25), (3, 5, 2, 3, 3) |
14 | 13 |
|
15 | | -ind = np.arange(N) # the x locations for the groups |
16 | | -width = 0.35 # the width of the bars |
| 14 | +ind = np.arange(len(men_means)) # the x locations for the groups |
| 15 | +width = 0.35 # the width of the bars |
17 | 16 |
|
18 | 17 | fig, ax = plt.subplots() |
19 | | -rects1 = ax.bar(ind, men_means, width, color='r', yerr=men_std) |
| 18 | +rects1 = ax.bar(ind - width/2, men_means, width, yerr=men_std, |
| 19 | + color='SkyBlue', label='Men') |
| 20 | +rects2 = ax.bar(ind + width/2, women_means, width, yerr=women_std, |
| 21 | + color='IndianRed', label='Women') |
20 | 22 |
|
21 | | -women_means = (25, 32, 34, 20, 25) |
22 | | -women_std = (3, 5, 2, 3, 3) |
23 | | -rects2 = ax.bar(ind + width, women_means, width, color='y', yerr=women_std) |
24 | | - |
25 | | -# add some text for labels, title and axes ticks |
| 23 | +# Add some text for labels, title and custom x-axis tick labels, etc. |
26 | 24 | ax.set_ylabel('Scores') |
27 | 25 | ax.set_title('Scores by group and gender') |
28 | | -ax.set_xticks(ind + width / 2) |
| 26 | +ax.set_xticks(ind) |
29 | 27 | ax.set_xticklabels(('G1', 'G2', 'G3', 'G4', 'G5')) |
30 | | - |
31 | | -ax.legend((rects1[0], rects2[0]), ('Men', 'Women')) |
| 28 | +ax.legend() |
32 | 29 |
|
33 | 30 |
|
34 | | -def autolabel(rects): |
| 31 | +def autolabel(rects, xpos='center'): |
35 | 32 | """ |
36 | | - Attach a text label above each bar displaying its height |
| 33 | + Attach a text label above each bar in *rects*, displaying its height. |
| 34 | +
|
| 35 | + *xpos* indicates which side to place the text w.r.t. the center of |
| 36 | + the bar. It can be one of the following {'center', 'right', 'left'}. |
37 | 37 | """ |
| 38 | + |
| 39 | + xpos = xpos.lower() # normalize the case of the parameter |
| 40 | + ha = {'center': 'center', 'right': 'left', 'left': 'right'} |
| 41 | + offset = {'center': 0.5, 'right': 0.57, 'left': 0.43} # x_txt = x + w*off |
| 42 | + |
38 | 43 | for rect in rects: |
39 | 44 | height = rect.get_height() |
40 | | - ax.text(rect.get_x() + rect.get_width()/2., 1.05*height, |
41 | | - '%d' % int(height), |
42 | | - ha='center', va='bottom') |
| 45 | + ax.text(rect.get_x() + rect.get_width()*offset[xpos], 1.01*height, |
| 46 | + '{}'.format(height), ha=ha[xpos], va='bottom') |
| 47 | + |
43 | 48 |
|
44 | | -autolabel(rects1) |
45 | | -autolabel(rects2) |
| 49 | +autolabel(rects1, "left") |
| 50 | +autolabel(rects2, "right") |
46 | 51 |
|
47 | 52 | plt.show() |
0 commit comments