python matplotlib模块解析_Python数据分析模块二:Matplotlib

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.

你可能感兴趣的