数据可视化之条形图(1):Axes.bar

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,)
简单条形图.png

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

本期到此为止,欢迎关注下一期:堆积条形图与误差线

你可能感兴趣的:(数据可视化之条形图(1):Axes.bar)