1. Matplotlib简介
Matplotlib是目前应用最广泛的用于制图及其他二维数据可视化的Python库。在命令行中输入pip install matplotlib即可进行安装。在matplotlib这个模块中,最常用的是其中一个子模块pyplot,通常这样导入:
import matplotlib.pyplot as plt
pyplot最基础的作图方式是以点作图,并用线将这些点连起来。以正弦函数为例,可以用pyplot画出它的图像:
import numpy as np
import matplotlib.pyplot as plt
x = np.arange(0, 2 * np.pi, 0.1)
y = np.sin(x)
plt.plot(x, y)
plt.show()
同时,还有一些可选的字符串缩写参数可以指定颜色和线条样式。例如plt.plot(x, y, 'ko--')指黑色虚线、坐标点标记为圆点。通常,可选的颜色有b(蓝)、g(绿)、r(红)、c(蓝绿)、m(洋红)、y(黄)、k(黑)、w(白);点标记有"."、","、"o"、"v"、"^"、">"、"
2. 数据展示的常用图表类型
①趋势:一种常见的时间序列关系,关注数据如何随时间变化。最常见的是折线图,能很好地表现指标随时间呈现的趋势。
②构成:关注每个部分占整体的比例,如份额、百分比等,最常见的是饼图。
③比较:可以展示某个维度上的排列顺序,常见的如条图、堆叠条图。
④分布:关注数据的集中、频率、分布情况,如地图、直方图、散点图。
⑤联系:查看两个变量之间是否表现出预期的相关关系,如散点图、雷达图。
3. 绘制折线图
折线图的基本画法是使用plt.plot()方法,传入的参数是坐标点。例如,要画出两种商品在一周内的销量对比图,可以通过如下代码实现:
x = ['周一', '周二', '周三', '周四', '周五', '周六', '周日']
y1 = [61, 42, 53, 72, 86, 91, 73]
y2 = [23, 26, 67, 38, 46, 54, 36]
# 设置字体,避免中文乱码
plt.rcParams['font.family'] = ['SimHei']
# 传入label参数用于图例
plt.plot(x, y1, label = '商品A')
plt.plot(x, y2, label = '商品B')
# 设置x, y轴标签
plt.xlabel('时间')
plt.ylabel('销量')
# 设置图表标题
plt.title('A、B商品销量对比图')
# 显示图例
plt.legend()
plt.show()
在上面的代码中,不要忽略设置中文字体的步骤,否则中文将会出现乱码。可以通过如下代码查看已经安装的字体,从中选择:
import matplotlib.font_manager as fm
for font in fm.fontManager.ttflist:
print(font.name)
此外,图表一般需要加入图例,在调用plt.plot()方法时传入label参数,接着调用plt.legend()方法显示图例即可。通常,matplotlib会自动将图例置于合适位置,如果想自行选择图例位置,可以通过向plt.legend()传入loc参数实现。
最后,通过plt.xlabel()和plt.ylabel()可以设置x轴和y轴的标签,通过plt.title()可以设置图表的标题。
4. 绘制柱状图
1) 普通柱状图
绘制普通柱状图只要调用plt.bar()方法即可。两个必选参数中,第一个参数是x轴上刻度的标签序列,第二个参数是对应的数据。例如,绘制体育课选课情况,可以通过如下代码:
names = ['篮球', '足球', '网球']
nums = [20, 18, 26]
plt.bar(names, nums)
plt.show()
此外,plt.bar()还有一些可选参数,如width和color,分别用于设置柱子的宽度和颜色。
2) 堆叠柱状图
堆叠柱状图不仅可以展示每个分类的总量,还能展示该分类包含的每个小分类的大小及占比,适合处理部分与整体的关系。例如,在上面代码的基础上,要展示不同性别学生的选课情况,可以通过如下代码来绘制堆叠柱状图:
names = ['篮球', '足球', '网球']
nums_boy = [15, 9, 10]
nums_girl = [5, 9, 16]
plt.bar(names, nums_boy, width = 0.6, color = 'blue', label = '男生')
plt.bar(names, nums_girl, bottom = nums_boy, width = 0.6, color = 'pink', label = '女生')
plt.legend()
plt.show()
与前面的代码相比,上面的代码多调用了一次plt.bar()方法,并传入了bottom参数,用于控制后一个柱状图绘制时底端的位置。如果没有设置bottom参数,后面绘制的柱状图就会覆盖在原来的图形上。
3) 分组柱状图
分组柱状图常用于不同组间数据的比较,这些组都包含了相同分类的数据。例如,将上面的分类绘制为分组柱状图:
x = np.arange(3)
width = 0.3
names = ['篮球', '足球', '网球']
nums_boy = [15, 9, 10]
nums_girl = [5, 9, 16]
plt.bar(x - width / 2, nums_boy, width = width, color = 'blue', label = '男生')
plt.bar(x + width / 2, nums_girl, width = width, color = 'pink', label = '女生')
plt.xticks(x, names)
plt.legend()
plt.show()
上述代码中,首先使用np.arange(3)创建了一个数组[0 1 2],并定义了一个变量width用于指定柱子的宽度。在调用plt.bar()时,第一个参数分别是[0 1 2]加上和减去柱子的宽度得到的刻度作为两组柱子的中点。最后,调用plt.xticks()方法将x轴上的刻度改为对应的标签即可。
5. 绘制饼图
饼图可以用于表示不同分类的占比情况,通过弧度大小来对比各种分类。绘制饼图只要传入数据和对应的标签给plt.pie()即可。以某地三大产业的占比为例,可以用如下代码绘制饼图:
data = [64745.2, 364835.2, 489700.8]
labels = ['第一产业', '第二产业', '第三产业']
plt.pie(data, labels = labels, autopct = '%0.1f%%')
plt.show()
其中,autopct参数代表图中百分比保留的小数位数,'%0.1f%%'表示保留一位小数,'%0.2f%%'表示保留两位小数。
此外,也可使用explode参数来让饼图中的某一部分突出显示,从而强调某项数据。explode参数中的元素默认都是0,将突出显示的部分对应位置的值设大一点,就可将对应的区块抽离出来。
data = [64745.2, 364835.2, 489700.8]
labels = ['第一产业', '第二产业', '第三产业']
explode = (0.1, 0, 0)
plt.pie(data, explode = explode, labels = labels, autopct = '%0.1f%%')
plt.show()
6. 绘制子图
一张图表很难同时分析多个维度,因此可以把多张图绘制在一起,进行多个维度的查看比较。通过matplotlib中的子图,可以在一张图中绘制多个图表。
调用plt.subplot()方法可以添加子图。plt.subplot()方法的前两个参数分别是子图的行数和列数,第三个参数是选中的子图的序号。使用set_title()可以为每个子图设置单独的标题,通过plt.suptitile()可以设置带有子图的图表的总标题。
例如,在一张图中绘制三个三角函数的图像:
x = np.arange(0, 2 * np.pi, 0.1)
plt.suptitle('三角函数图像')
ax1 = plt.subplot(2, 2, 1)
ax1.set_title('sin函数')
y1 = np.sin(x)
ax1.plot(x, y1)
ax2 = plt.subplot(2, 2, 2)
ax2.set_title('cos函数')
y2 = np.cos(x)
ax2.plot(x, y2)
ax3 = plt.subplot(2, 1, 2)
ax3.set_title('tan函数')
y3 = np.tan(x)
ax3.plot(x, y3)
plt.show()
Reference:
[1] Wes McKinney. 2017. Python for Data Analysis: Data Wrangling with Pandas, NumPy, and IPython, 2nd Edition [M]. O'Reilly Media, Inc.
[2] CSDN博客. Python博客[OL]. https://www.csdn.net/nav/python. 2020.
[3] 扇贝编程. Python数据分析[OL]. 扇贝编程. 2020.