目录

Matplotlib 初识

Matplotlib 是 Python 中常用的 2D 绘图库,它能轻松地将数据进行可视化,作出精美的图表。

本地环境需要使用 pip install matplotlib 进行安装。

Matplotlib 这个模块很庞大,最常用的是其中一个子模块——pyplot,通常这样导入它:

import matplotlib.pyplot as plt

pyplot 中最基础的作图方式是以点作图,即给出每个点的坐标,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()

结果:

数据可视化 -- Matplotlib①_图例


我们以上面的代码为例进行基本的说明:

第一行代码(x = np.arange(0, 2 * np.pi, 0.1)):代表生成一个范围是0到2Π步长为0.1的数组。

步长越小,每个点间隔小一点,点的数量多一点。这样画出的图像更加接近真实情况,也更加的平滑。

第二行代码(y = np.sin(x)):np.sin() 方法是 numpy 中计算正弦函数的方法,我们将 x 的值传进去就得到对应的正弦值。

除了 np.sin() 方法之外,numpy 中也有 np.cos()、np.tan() 等计算三角函数的方法。

第三行代码(plt.plot(x, y))【​​核心代码​​】:有了 x 和 y 的值之后,将其分别传入 plt.plot() 方法,pyplot 会将其转换成对应的坐标。将这些坐标连成线就得到了函数的图像.

第四行代码(plt.show()):要想图像能显示就必须在最后调用plt.show()

注意:plt.plot() 方法接收任意对数的 x 和 y,它会将这些图像在一张图上都画出来。
例如:我现在可以继续在那张图上画一个余弦函数的图像
代码实现:

x = np.arange(0, 2 * np.pi, 0.1)
y1 = np.sin(x)
y2 = np.cos(x)
plt.plot(x, y1, x, y2)
plt.show() # 这行代码不能丢,否则不显示图像

结果:

数据可视化 -- Matplotlib①_数据_02


当然你也可以每对 x 和 y 都调用一次 plt.plot() 方法,这也没毛病:

x = np.arange(0, 2 * np.pi, 0.1)
y1 = np.sin(x)
y2 = np.cos(x)
plt.plot(x, y1) # 正弦函数图像
plt.plot(x, y2) # 余弦函数图像
plt.show()

结果同上。

注意:不要看到调用了两次plt.plot()就认为画在了两张图上面,仍是在一张图上!

格式化参数

plt.plot()中,对于每一对x,y都可以传入一个可选的格式化参数,用来指定线条的颜色、点标记和线条的类型。
例如:

x = np.arange(0, 2 * np.pi, 0.1)
y1 = np.sin(x)
y2 = np.cos(x)
plt.plot(x, y1, 'ro--') # 正弦函数图像
plt.plot(x, y2, 'b*-.') # 余弦函数图像
# 等价于 plt.plot(x, y1, 'ro--', x, y2, 'b*-.')
plt.show()

结果:

数据可视化 -- Matplotlib①_折线图_03


以 ‘ro–’ 为例,它分为 3 部分:r 代表红色(red),o 代表的是圆点标记,-- 代表着虚线。ro-- 的意思就是线条为红色虚线、坐标点标记为圆点。

格式化参数的这 3 部分都是可选的,也没有顺序要求。你可以只传入一个 ‘r’ 来指定颜色,也可以写成 --or。格式化参数的每部分都有很多选项,因此能形成很多组合,下图列出了格式化参数常用的选项及其含义:

数据可视化 -- Matplotlib①_图例_04

小贴士:代表颜色的字母都是对应英文单词的首字母,黑色除外,因为黑色和蓝色首字母都是 b,因此黑色用尾字母 k 表示。

数据展示是一种分析方法

既然我们通过数据分析来进行决策,那么使用合适的图表来准确地展示数据是至关重要的。要做到这一点,首先你要理解每种图表的表达方式及其适用场景。然后,根据要分析的目标选择合适的图表类型。除了折线图、柱状图、饼图等我们习以为常的图表类型,还有很多实用的图表类型。所以在绘制图表之前,我们要先了解各种图表类型的适用场景。

实际使用中,我们会用到各种各样的几十种图表。按照数据展示的目标可以把它们分为五种,分别是:趋势、比较、构成、分布和联系。

数据可视化 -- Matplotlib①_python_05


这五种类型的区别:

趋势:这是最常见的一种时间序列关系,关心数据如何随着时间变化,趋势类里的图表能直观反映出每年、每月、每天的变化趋势,增长、减少、上下波动还是基本不变。最常见的是折线图,它能很好地表现指标随时间呈现的趋势。

构成:主要关注每个部分占整体的比例,如果你想分析的目标诸如“份额”、“百分比”等。展示构成关系的图表类型里,最常见的就是饼图。

比较:可以展示某个维度上的排列顺序,分析某维度之间的对比是差不多,还是 “大于”、“小于”,比如分析男生和女生的身高差别。

分布:当你关心数据集中、频率、分布时,比如根据地理位置数据,通过地图来展示不同分布特征。比较常用的图表有地图、直方图、散点图。

联系:主要查看两个变量之间是否表达出我们预期所要证明的相关关系。比如预期销售额可能随着优惠折扣的增长而增长,常用于表达“与……有关”、“随……而增长”、“随……而不同”等维度间的关系。

在进行数据可视化时,要先明确分析的目标,再来选择五种分类的适合分类,最后选择某个分类里面合适的图表类型。我们要努力让图表更容易被解读,清晰地看到数据背后隐藏的奥秘!

绘制折线图

首先我们要明确要想绘制折线图我们的做法还是​​描点​​,那么我们就可以使用到前面提到的方法plt.plot(),不过要发生一些小的改变,在画曲线图的时候我们传入的是x,y坐标点,此次画折线图传入的x 和 y 分别是时间点和对应的数据
例如:

import matplotlib.pyplot as plt

# 时间
x = ['周一', '周二', '周三', '周四', '周五', '周六', '周日']
# 销量
y = [61, 42, 52, 72, 86, 91, 73]
# 设置字体,解决中文乱码问题
plt.rcParams['font.family'] = ['Noto Sans CJK JP']
plt.plot(x, y)
plt.show()

结果:

数据可视化 -- Matplotlib①_python_06


上面是某商品一周的销量走势。x 轴传入时间,y 轴传入对应的销量

因为图中有中文,所以需要通过 plt.rcParams[‘font.family’] = [‘Noto Sans CJK JP’] 来设置中文字体,否则中文将会乱码。
​​​Noto Sans CJK JP​​在你的本地环境不一定适用,你可以通过如下代码打印出已经安装的字体,找到其中的中文字体名称替换掉 Noto Sans CJK JP 即可,例如 SimHei(黑体)等。

import matplotlib.font_manager as fm

for font in fm.fontManager.ttflist:
print(font.name)

你也可以直接c盘 --> windows --> Fonts 找到你电脑上已经下载好的字体。选好字体之后查看其属性,找到xxx.TTF,再用xxx替换也可以。

我也可以将多个商品的销量走势画在一张图上进行对比,只需调用两次 plt.plot() 方法即可。

# 时间
x = ['周一', '周二', '周三', '周四', '周五', '周六', '周日']
# 商品 A 销量
y1 = [61, 42, 52, 72, 86, 91, 73]
# 商品 B 销量
y2 = [23, 26, 67, 38, 46, 55, 33]
plt.plot(x, y1)
plt.plot(x, y2)
#plt.plot(x, y1,x,y2)也可以
plt.show()

结果:

数据可视化 -- Matplotlib①_python_07

添加图例

同时我们可以添加图例,帮助我们区分两条曲线。
做法:在调用 plt.plot() 方法时传入 label 参数,接着调用 plt.legend() 方法显示图例即可。
例如:

x = ['周一', '周二', '周三', '周四', '周五', '周六', '周日']
y1 = [61, 42, 52, 72, 86, 91, 73]
y2 = [23, 26, 67, 38, 46, 55, 33]
# 传入 label 参数
plt.plot(x, y1, label='商品 A')
plt.plot(x, y2, label='商品 B')
# 显示图例
plt.legend()
plt.show()

数据可视化 -- Matplotlib①_图例_08


注意:这个有的人可能也想把两个合并写到一起,就像

plt.plot(x, y1, label=‘商品 A’,x, y2, label=‘商品 B’)这肯定是错的,因为关键字参数一定是在位置参数的后面的!就算你再把前面的label放到后面去,也会出现参数重复的错误。我们还可以看到,图例被放在了图表的左上方,图例位置其实是可以设置的,不设置的情况下 matplotlib 会帮你自动找一个合适的位置放置。如果想自行选择图例位置的话可以通过 plt.legend() 方法的 loc 参数实现,loc 参数共有如下 11 种方式可供选择:

数据可视化 -- Matplotlib①_图例_09

添加轴的标签以及图标标题

我们还可以通过 plt.xlabel() 和 plt.ylabel() 方法来设置 x 轴和 y 轴的标签,还能通过 plt.title() 给图表设置标题
例如:

x = ['周一', '周二', '周三', '周四', '周五', '周六', '周日']
y1 = [61, 42, 52, 72, 86, 91, 73]
y2 = [23, 26, 67, 38, 46, 55, 33]
plt.plot(x, y1, label='商品 A')
plt.plot(x, y2, label='商品 B')
# 设置 x 轴标签
plt.xlabel('时间')
# 设置 y 轴标签
plt.ylabel('销量')
# 设置图表标题
plt.title('商品销量对比图')
plt.legend()
plt.show()

结果:

数据可视化 -- Matplotlib①_图例_10

柱状图,饼图,以及子图的绘制请看下篇