折线图和散点图常用且实用,但是并不能满足我们的作图需求。
这次我们会尝试更多常见的统计图形,比如条形图、直方图、饼图等,我们的目标是掌握工作学习过程中使用最频繁的图形技能。
1. 柱状图(条形图) —— bar() / barh()
柱状图又叫条形图,用于绘制定性(分类)数据的分布特征,比如不同国家的GDP、不同年龄段的平均体重等。这次,我们以一组学生的身高来演示它的作图方法。
import matplotlib.pyplot as plt # 生成数据 x = [1, 2, 3, 4, 5, 6, 7, 8] y = [176, 165, 188, 150, 170, 180, 172, 160] # 画柱状图 plt.bar(x, y, align = 'center', color = 'c', tick_label = ['q', 'a', 'c', 'e', 'r', 'j', 'b', 'p'], hatch = '/') # 设置轴标签 plt.xlabel('学生编号') plt.ylabel('身高(cm)') plt.show()
参数:
- align:对齐方式,即条形相对于刻度的位置
- color:颜色
- tick_label:刻度的标签
- hatch:填充
我们还可以使用barh画水平(horizontal)方向的条形图,它们两个函数的参数基本一致,只是我们要将xlabel和ylabel的值对调一下(注意:x和y不需要对调):
import matplotlib.pyplot as plt # 生成数据 x = [1, 2, 3, 4, 5, 6, 7, 8] y = [176, 165, 188, 150, 170, 180, 172, 160] # 画柱状图 plt.barh(x, y, align = 'center', color = 'c', tick_label = ['q', 'a', 'c', 'e', 'r', 'j', 'b', 'p'], hatch = '/') # 设置轴标签 plt.xlabel('身高(cm)') plt.ylabel('学生编号') plt.show()
2. 直方图 —— hist()
直方图跟条形图很像,但是直方图是用于表现定量数据的分布,比如说中国人口的年龄分布情况、一所高中高三所有学生的高考成绩的分布情况等。跟bar()和barh()不同的是,hist()函数输入的只有一组数据,在输出的图形中,横坐标对应着不同的分组,纵坐标则对应着该组的计数。
import matplotlib.pyplot as plt import numpy as np # 生成数据 x = np.random.randint(0, 10, 500) # 直方图 plt.hist(x, bins = range(0, 11), color = 'g', histtype = 'bar', rwidth = 0.95, alpha = 0.6) # 设置轴标签 plt.xlabel('分组') plt.ylabel('计数') plt.show()
参数:
- bins:如果参数是一个整数,则相当于我们制定了分桶的数量,如果参数是一个列表,则相当于我们指定了每个分桶的边界。
- histtype:分桶样式
- rwidth:相对宽度,即每个柱子宽度相对于两个刻度之间宽度的比例。
- alpha:透明度
3. 饼图 —— pie()
饼图主要用于绘制不同类型的百分比,比如不同国家的人口占比、一个员工的薪资构成等。我们假设有ABCD四个公司,他们瓜分了一块市场,我们用饼图来将他们的市场占有情况表现出来:
import matplotlib.pyplot as plt import numpy as np # 生成数据 ratio = [0.1, 0.4, 0.35, 0.15] labels = ['A', 'B', 'C', 'D'] # 直方图 plt.pie(ratio, labels=labels, autopct='%3.1f%%', startangle=90) # 设置轴标签 plt.title('不同公司市场占比') plt.show()
参数:
- labels: 类别标签/名称
- autopct:饼图种比例数字的格式
- startangle:起始角度,默认会逆时针从水平0度角开始排列
- color:我们可以用一个列表指定不同分类的颜色ß
4. 极线图 —— polar()
这一函数用于在极坐标轴上绘制折线图。
import matplotlib.pyplot as plt import numpy as np # 生成数据 theta = np.linspace(0, 2*np.pi, 12, endpoint=False) r = np.random.rand(12) # 极线图 plt.polar(theta, r, color = 'chartreuse', linewidth = 2, marker = '*', mfc = 'b', ms = 10) plt.show()
5. 散点图 —— scatter()
我们在之前已经接触过散点图了,但是这次我们将展示更强大的散点图。
import matplotlib.pyplot as plt
import matplotlib as mpl
import numpy as np
# 生成数据
x = np.random.randn(100)
y = np.random.randn(100)
# 散点图
plt.scatter(x, y,
s = np.power(10*x+20*y, 2),
c = np.random.rand(100),
cmap = mpl.cm.RdYlBu,
marker = ‘o’,
alpha = 0.3)
)
plt.show()
我们指定了横纵坐标的数据、每个点的大小、每个点的颜色以及浮点数到颜色的映射表、标记的形状以及透明度,看,通过这种方式,我们可以对多维数据进行可视化。
6. 杆图 —— stem()
刘大成先生在《Python数据可视化之matplotlib实践》一书中将其翻译为棉棒图,挺形象的,但是我还是强行使用了杆图的名字,虽然这个名字简直难听到了天际……
杆图用于绘制离散而有序的数据,在图中,这些离散的点会分布在一条基线的上下两侧,我们可以直观地感受到它们的波动趋势以及分布情况。
import matplotlib.pyplot as plt import numpy as np # 生成数据 x = np.linspace(0, 10, 20) y = np.random.randn(20) # 绘图 plt.stem(x, y, linefmt='-.', markerfmt='o', basefmt='-') plt.show()
参数:
- linefmt:离散点到基线的垂线的样式
- markerfmt:离散点的样式
- basefmt:基线的样式
这里fmt是format的简写。
7. 箱线图 —— boxplot()
箱线图是非常经典、实用且常用的一种用于观察连续数据分布的图形,它能清晰地展示出数据的上下四分位数、上下边缘、中位数的位置,还能根据规则帮助我们确定一些异常值,是观察数据分布的一大利器。
import matplotlib.pyplot as plt import numpy as np # 生成数据 x = np.random.randn(1000) # 绘图 plt.boxplot(x) # 添加网格 plt.grid(axis='y', ls=':', lw=1, color='gray', alpha=0.4) plt.show()
8. 误差棒图 —— errorbar()
此函数用于绘制y轴方向或者x轴方向的误差范围:
import matplotlib.pyplot as plt
import numpy as np
# 生成数据
x = np.linspace(0, 1, 10)
y = np.exp(x)
# 绘图
plt.errorbar(x, y, fmt=’:og’, yerr=np.power(x, 2), xerr=0.02)
plt.show()
这里我们使用横坐标的平方作为y轴方向上的误差,同时使用一个常数0.02作为x轴方向上的误差。在fmt(format)参数下,我们使用’:og’将线条设置为虚线、将数据点设置为大圆点、将颜色设置为绿色。