matplotlib.__version__ = 3.3.3
摘要:描述了应该如何绘制简单条形图、分组条形图
条形图
条形图是统计中非常常用的一种统计图表,它用来展示定类数据和定量数据。一张好的条形图能够有效地展示统计信息。那么如何使用Python利用matplotlib来绘制一张符合自己预期的条形图呢?
1. 先来看看怎么绘制最基本的条形图
import matplotlib.pyplot as plt
names = ['Chen', 'Wang', 'Lee', 'Zheng']
ages = [25, 22, 21, 24]
# 绘制两组图
fig, ax = plt.subplots()
ax.bar(names, ages,)
2. 让我们在条形图上加上图例
import matplotlib.pyplot as plt
names = ['Chen', 'Wang', 'Lee', 'Zheng']
ages = [25, 22, 21, 24]
# 绘制两组图
fig, ax = plt.subplots()
ax.bar(names, ages, label='Age') # 添加标签,便于绘制图例
ax.legend() # 绘制图例
这个添加图例的小技巧你可以应用到几乎所有图形
3.试试两组条形图
有时候我们希望比较同一组人不同的属性,或者同一组属性不同组的人之间的差异,这个时候我们就需要绘制分组的条形图。
3.1. 对于两组而言,这里有一个取巧的简洁方法
import matplotlib.pyplot as plt
names = ['Chen', 'Wang', 'Lee', 'Zheng']
ages = [25, 22, 21, 24]
mental_ages = [7, 8, 9, 10]
fig, ax = plt.subplots()
# 注意引入了align参数,同时第二个width是负数
ax.bar(names, ages, align='edge', width=0.4, label='Age')
ax.bar(names, mental_ages, align='edge', width=-0.4, label='Mental Age')
ax.legend()
注意引入了align参数,同时第二个width是负数
3.2. 但是以下的方法更为通用
import matplotlib.pyplot as plt
names = ['Chen', 'Wang', 'Lee', 'Zheng']
ages = [25, 22, 21, 24]
mental_ages = [7, 8, 9, 10]
fig, ax = plt.subplots()
all_width = 0.6 # 两个条柱的总宽度
width = all_width / 2 # 一个条柱的宽度
onset = width / 2 # 偏移量是半个条柱的宽度
# 创建x坐标
x1, x2 = [x-onset for x in range(4)], [x+onset for x in range(4)]
# 绘图
ax.bar(x1, ages,width=width, label='Age')
ax.bar(x2, mental_ages, width=width, label='Mental Age')
# 修改刻度数量,并且修正为名称
ax.set_xticks(range(4))
ax.set_xticklabels(names)
ax.legend()
其背后的思路是使用数值(而不是标签)来指定条形的位置,这里有两组数据,每个标签对应两个位置。
因此,你可以想象,例如在0两边,两个条形的中心位置应该分别为 负的半个条柱宽度和正的半个条柱宽度。根据这一点,我们分别创建x1列表,x2列表,也就是两组的坐标。
此外,由于使用了数字作为坐标,后续需要改回文字坐标。
4. 试试三组
import matplotlib.pyplot as plt
names = ['Chen', 'Wang', 'Lee', 'Zheng']
ages = [25, 22, 21, 24]
mental_ages = [7, 8, 9, 10]
money = [18, 14, 12, 14]
fig, ax = plt.subplots()
all_width = 0.9 # 三个条柱的总宽度
width = onset = all_width / 3 # 偏移量是一个条柱的宽度
x1 = [x-onset for x in range(4)]
x2 = range(4)
x3 = [x+onset for x in range(4)]
# 绘图
ax.bar(x1, ages,width=onset, label='Age')
ax.bar(x2, mental_ages, width=onset, label='Mental Age')
ax.bar(x3, money, width=onset, label='Money')
# 修改刻度数量,并且修正为名称
ax.set_xticks(range(4))
ax.set_xticklabels(names)
# 绘制图例
ax.legend()
5. 实际上,组数与偏移量有一定的关系
在组数为偶数时,偏移量总是单个条形图宽度的一半;
在组数为奇数时,偏移量总是单个条形图宽度;
def group_and_onset(group_number, all_width=0.9):
# 组数与偏移量的关系
all_width = 0.9
width = all_width / group_number
onset = ((-1)**group_number + 3) / 4 * width
return group_number, all_width, onset