折线图和散点图常用且实用,但是并不能满足我们的作图需求。
这次我们会尝试更多常见的统计图形,比如条形图、直方图、饼图等,我们的目标是掌握工作学习过程中使用最频繁的图形技能。
欢迎大家关注我的个人博客【数洞】 【备用站】
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'将线条设置为虚线、将数据点设置为大圆点、将颜色设置为绿色。
好了,以上就是今天要分享的几种常用的统计图形,今天我们的目标就是掌握这些图形对应的函数的基本调用,后边我们会详细探索它们在实际的数据分析过程中的应用。