【Python数据挖掘】Matplotlib的使用手册一
库的安装
整个数据挖掘基础阶段我们将会用到 Matplotlib、Numpy、Pandas、TA-Lib 等库,所以我们要先进行库的安装
按 win + R 快捷键,输入 cmd 然后回车,可以来到控制台界面
依次复制粘贴下面的命令到控制台来进行相应库的安装
python -m pip install Matplotlib
python -m pip install Numpy
python -m pip install Pandas
python -m pip install tables
python -m pip install TA-Lib
python -m pip install jupyter -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com
温馨提示
操作如图
Successfully installed 表示安装成功
Jupyter Notebook的使用
1. Jupyter Notebook介绍
Jupyter 项目是一个非盈利的开源项目,源于 2014 年的 ipython 项目,并逐渐发展为支持所有编程语言的交互式数据科学计算的工具
- Jupyter Notebook,原名 IPython Notebook,是 IPython 的加强网页版,一个开源 Web 应用程序
- 名字源自 Julia、Python 和 R(数据科学的三种开源语言)
- 是一款程序员和科学工作者的编程/文档/笔记/展示软件
- .ipynb 文件格式是用于计算型叙述的 JSON 文档格式的正式规范
Jupyter 项目旨在开发跨几十种编程语言的开源软件,开放标准和用于交互式计算的服务
2. 为什么使用 Jupyter Notebook?
- 传统软件开发:工程 / 目标明确 ◦ 需求分析,设计架构,开发模块,测试
- 数据挖掘:艺术 / 目标不明确 ◦ 目的是具体的洞察目标,而不是机械地完成任务 ◦ 通过执行代码来理解问题 ◦ 迭代式地改进代码来改进解决方法
实时运行的代码、叙事性的文本和可视化被整合在一起,方便使用代码和数据来讲述故事
对比 Jupyter Notebook 和 Pycharm,前者有下面两个优势:
- 画图方面的优势
- 数据展示方面的优势
3. Jupyter Notebook 的使用
第一行代码 —— helloworld
界面启动、创建文件
- 界面启动
环境搭建好后,在控制台输入 python -m jupyter notebook 命令,会自动弹出浏览器窗口打开 Jupyter Notebook
# 进入虚拟环境
workon ai
# 输入命令
jupyter notebook
本地 notebook 的默认 URL 为:http://localhost:8888
想让 notebook 打开指定目录,只要进入此目录后执行命令即可
-
新建 notebook 文档 ◦ notebook 的文档格式是 .ipynb
-
打印 helloworld
-
按快捷键 shift + enter 可以运行代码,也可以点击运行按钮
4. 界面指南
基础操作
- 标题栏:点击标题(如 Untitled)可以修改文档名、菜单栏
- 导航 ➝ File ➝ Download as,可以另存为其他格式
- 导航 ➝ Kernel ◦ Interrupt,中断代码执行(程序卡死时) ◦ Restart,重启 Python 内核(执行太慢时重置全部资源) ◦ Restart & Clear Output,重启并清除所有输出 ◦ Restart & Run All,重启并重新运行所有代码
cell操作
什么是 cell 呢?
- cell:一对 In Out 会话被视作一个代码单元,这个代码单元就是一个 cell
Jupyter 支持两种模式:
- 编辑模式(Enter) ◦ 命令模式下,按 Enter 键或者鼠标双击 cell 进入编辑模式 ◦ 可以操作 cell 内文本或代码,剪切 / 复制 / 粘贴 / 移动 等操作
- 命令模式(Esc) ◦ 按 Esc 键退出编辑,进入命令模式 ◦ 可以操作 cell 单元本身进行 剪切 / 复制 / 粘贴 / 移动 等操作
快捷键的操作
- 两种模式通用快捷键 ◦ Shift + Enter:执行本单元代码,然后跳转到下一单元 ◦ Ctrl + Enter:执行本单元代码,然后留在本单元
如果cell 行号前出现了一个星号(*),那表示代码正在运行
- 命令模式:按 ESC 进入 ◦ Y:cell 切换到 Code 模式 ◦ M:cell 切换到 Markdown 模式 ◦ A:在当前 cell 的上面添加 cell ◦ B:在当前 cell 的下面添加 cell ◦ 双击 D:删除当前 cell ◦ Z:回退 ◦ L:为当前 cell 加上行号 ◦ Ctrl + Shift + P:对话框输入命令直接进行 ◦ 快速跳转到首个 cell,Ctrl + Home ◦ 快速跳转到最后一个 cell:Ctrl + End
- 编辑模式:按 Enter 进入 ◦ 多光标操作: Ctrl 键点击鼠标(Mac: CMD + 点击鼠标) ◦ 回退: Ctrl + Z(Mac: CMD + Z) ◦ 重做: Ctrl + Y(Mac: CMD + Y) ◦ 补全代码:变量、方法后跟 Tab 键 ◦ 为一行或者多行代码添加 / 取消注释: Ctrl + / (Mac: CMD + /) ◦ 屏蔽自动输出信息:可在最后一条语句之后添加一个分号
Matplotlib 之 HelloWorld
1. 什么是Matplotlib
画二维图表的 Python 库
- 专门用于开发 2D 图表(包括 3D 图表)
- 使用起来及其方便
- 以渐进、交互方式实现数据可视化
2. 为什么要学习Matplotlib
可视化是在整个数据挖掘的关键辅助工具,可以清晰地理解数据,从而调整我们的分析方法
- 能将数据进行可视化,更直观的呈现
- 使数据更加客观、更具说服力
3. 实现一个简单的Matplotlib画图
import matplotlib.pyplot as plt
%matplotlib inline
plt.figure()
plt.plot([1, 0, 9], [4, 5, 6])
plt.show()
效果如下
其实就是把坐标点连起来
4. Matplotlib三层结构
容器层
容器层主要由 Canvas、Figure、Axes 组成
Canvas 是位于最底层的系统层,在绘图的过程中充当画板的角色,即放置画布(Figure)的工具
Figure 是 Canvas 上方的第一层,也是需要用户来操作的应用层的第一层,在绘图的过程中充当画布的角色
Axes 是应用层的第二层,在绘图的过程中相当于画布上的绘图区的角色
- Figure:指整个图形(可以通过
plt.figure()
设置画布的大小和分辨率等) - Axes (坐标系) :数据的绘图区域
- Axis (坐标轴) :坐标系中的一条轴,包含大小限制、刻度和刻度标签
特点
- 一个 figure (画布) 可以包含多个 axes (坐标系/绘图区),但是一个 axes 只能属于一个 figure
- 一个 axes (坐标系/绘图区) 可以包含多个 axis (坐标轴),包含 2 个即为 2d 坐标系,3 个即为 3d 坐标系
辅助显示层
辅助显示层为 Axes(绘图区)内的除了根据数据绘制出的图像以外的内容,主要包括 Axes 外观(facecolor)、边框线(spines)、坐标轴(axis)、坐标轴名称(axis label)、坐标轴刻度(tick)、坐标轴刻度标签(tick label)、网格线(grid)、图例(legend)、标题(title)等内容
该层的设置可使图像显示更加直观、更加容易被用户理解,但又不会对图像产生实质的影响
图像层
图像层指 Axes 内通过 plot、scatter、bar、histogram、pie 等函数根据数据绘制出的图像
折线图(plot)与基础绘图功能
1. 折线图绘制与保存图片
为了更好地理解所有基础绘图功能,我们通过天气温度变化的绘图来融合所有的基础 API 使用
▷ matplotlib.pyplot模块
matplotlib.pyplot 包含了一系列类似于 matlab 的画图函数,它的函数作用于当前图形 (figure) 的当前坐标系 (axes)
import matplotlib.pyplot as plt
▷ 折线图绘制与显示
# 1. 创建画布(容器层)
plt.figure()
# 2. 绘制折线图(图像层)
plt.plot([1, 2, 3, 4, 5, 6, 7], [17, 17, 18, 15, 11, 11, 13])
# 3. 显示图像
plt.show()
折线图显示效果
可以看到这样显示效果并不好,我们可以加入更多的功能
▷ 设置画布属性与图片保存
plt.figure(figsize=(),dpi=) figsize: 指定图的长度 dpi: 图像的清晰度 返回fig对象 plt.savefig(path)
# 1. 创建画布,并设置画布属性
plt.figure(figsize=(20, 8),dpi=80)
# 2. 保存图片到指定路径
plt.savefig("test.png")
- 注意:
plt.show()
会释放 figure 资源,如果在显示图像之后保存图片将只能保存空图片
折线图显示效果
2. 案例:显示温度变化状况
▷ 需求:
画出某城市 11 点到 12 点 1 小时内每分钟的温度变化折线图,温度范围在 15 度 ~ 18 度
▷ 效果:
3. 案例步骤一:辅助显示层
▷ 1 - 准备数据并画出初始折线图
import random
import matplotlib.pyplot as plt
# 1. 准备数据
x = range(60)
y_shanghai = [random.uniform(15, 18) for i in x]
# 2. 创建画布
plt.figure(figsize=(20, 8), dpi=80)
# 3. 绘制图像
plt.plot(x, y_shanghai)
# 4. 显示图像
plt.show()
初始折线图
▷ 2 - 添加自定义x,y刻度
plt.xticks(x, **kwargs)
x:要显示的刻度值plt.yticks(y, **kwargs)
y:要显示的刻度值
import random
import matplotlib.pyplot as plt
# 1. 准备数据
x = range(60)
y_shanghai = [random.uniform(15, 18) for i in x]
# 2. 创建画布
plt.figure(figsize=(20, 8), dpi=80)
# 3. 绘制图像
plt.plot(x, y_shanghai)
# 修改x,y刻度
# 准备x的刻度说明
x_label = ["11点{}分".format(i) for i in x]
plt.xticks(x[::5], x_label[::5])
plt.yticks(range(0, 40, 5))
# 4. 显示图像
plt.show()
折线图
在运行后,可能会出现中文字符显示为方格的问题,下面我们来说一下解决方法
偷懒的用这种方法,添加下面两行代码即可:
plt.rcParams['font.sans-serif'] = [u'SimHei']
plt.rcParams['axes.unicode_minus'] = False
或者一行代码:
plt.rc('font', family='SimHei', size=13)
下载中文字体(黑体,看准系统版本)
- 下载 SimHei 字体(或者其他支持中文显示的字体也行)
1)安装字体
- windows 和 mac 下:双击安装
- linux 下:拷贝字体到 usr/share/fonts 下:
sudo cp ~/SimHei.ttf /usr/share/fonts/SimHei.ttf
注意:Linux 如果用 ubantu 也可以通过双击安装
2)删除 matplotlib 缓存文件
Mac 系统的解决方案:
- 删除 ~/ .matplotlib 中的缓存文件
cd ~/ .matplotlib
rm -r *
Linux 系统的解决方案:
- 删除 ~/ .cache/matplotlib 中的缓存文件
cd ~/ .cache/matplotlib
rm -r *
3)修改配置文件 matplotlibrc
Mac 系统的解决方案:
- 修改配置文件 matplotlibrc
vi ~/ .matplotlib/matplotlibrc
将文件内容修改为:
font.family : sans-serif
font.sans-serif : SimHei
axes.unicode_minus : False
Linux 系统的解决方案:
- 修改配置文件
sudo find -name matplotlibrc
返回结果:
./.virtualenvs/lib/python3.5/site-packages/matplotlib/mpl-data/matplotlibrc
打开配置文件
vi ./.virtualenvs/lib/python3.5/site-packages/matplotlib/mpl-data/matplotlibrc
将配置文件中下面 3 项改为:
font.family : sans-serif
font.sans-serif : SimHei
axes.unicode_minus : False
▷ 3 - 添加网格显示
为了更加清楚地观察图形对应的值,我们可以给折线图添加网格
plt.grid(True, linestyle='--', alpha=0.5)
效果如图:
▷ 4 - 添加描述信息
添加 x 轴、y 轴描述信息以及标题
plt.xlabel("时间")
plt.ylabel("温度")
plt.title("某城市中午11点0分到12点之间的温度变化图示")
效果如图:
4. 案例步骤二:图像层
▷ 需求:再添加一个城市的温度变化
收集到北京当天温度变化情况,温度在 1 度到 3 度
▷ 1 - 多次plot
怎么去添加另一个在同一个坐标系中的不同图形呢?
其实很简单,我们只需要再次 plot 即可,但是需要区分线条,如下显示
# 添加背景的温度数据
y_beijing = [random.uniform(1, 3) for i in x]
# 绘制折线图
plt.plot(x, y_beijing, color="b", linestyle='--', label="北京")
# 显示图例
plt.legend(loc="best")
效果如图:
▷ 2 - 设置图形风格
颜色字符 | 风格字符 |
---|---|
r 红色 | - 实线 |
g 绿色 | -- 虚线 |
b 蓝色 | -. 点划线 |
w 白色 | :点虚线 |
c 青色 | ‘ ’ 留空、空格 |
m 洋红 | |
y 黄色 | |
k 黑色 |
▷ 3 - 显示图例
- 注意:如果只在 plt.plot() 中设置 label 还不能最终显示出图例,还需要通过 plt.legend() 将图例显示出来
plt.legend(loc="best")
Location String | Location Code |
---|---|
'best' | 0 |
'upper right' | 1 |
'upper left' | 2 |
'lower left' | 3 |
'lower right' | 4 |
'right' | 5 |
'left' | 6 |
以上效果完整代码:
import random
import matplotlib.pyplot as plt
plt.rc('font', family='SimHei', size=13)
# 1. 准备数据
x = range(60)
y_shanghai = [random.uniform(15, 18) for i in x]
y_beijing = [random.uniform(1, 3) for i in x]
# 2. 创建画布
plt.figure(figsize=(20, 8), dpi=80)
# 3. 绘制图像
plt.plot(x, y_shanghai, color="r", label="上海")
plt.plot(x, y_beijing, color="b", linestyle='--', label="北京")
# 修改x,y刻度
# 准备x的刻度说明
x_label = ["11点{}分".format(i) for i in x]
plt.xticks(x[::5], x_label[::5])
plt.yticks(range(0, 40, 5))
# 添加网格显示
plt.grid(True, linestyle='--', alpha=0.5)
# 添加描述信息
plt.xlabel("时间")
plt.ylabel("温度")
plt.title("上海、北京中午11点0分到12点之间的温度变化图示")
# 显示图例
plt.legend()
# 4. 显示图像
plt.show()
5. 案例步骤三:多个坐标系显示
多个坐标系显示 - plt.subplots,是面向对象的画图方法
如果我们想要将上海和别境的天气图显示在同一个图的不同坐标系当中,效果如下:
可以通过 subplots 函数实现(旧的版本中有 subplot,使用不方便)
plt.subplots(nrows=1, ncols=1, **fig_kw)
创建一个带有多个 axes (坐标系/绘图区)的图- 注意:
plt.函数名()
相当于面向过程的画图方法,axes.set_方法名()
相当于面向对象的画图方法
修改后完整代码为:
import random
import matplotlib.pyplot as plt
plt.rc('font', family='SimHei', size=12)
# 1. 准备数据
x = range(60)
y_shanghai = [random.uniform(15, 18) for i in x]
y_beijing = [random.uniform(1, 3) for i in x]
# 2. 创建画布
figure, axes = plt.subplots(nrows=1, ncols=2, figsize=(20, 8), dpi=80)
# 3. 绘制图像
axes[0].plot(x, y_shanghai, color="r", label="上海")
axes[1].plot(x, y_beijing, color="b", linestyle='--', label="北京")
# 修改x,y刻度
# 准备x的刻度说明
x_label = ["11点{}分".format(i) for i in x]
axes[0].set_xticks(x[::10], x_label[::10])
axes[0].set_yticks(range(0, 40, 5))
axes[1].set_xticks(x[::10], x_label[::10])
axes[1].set_yticks(range(0, 40, 5))
# 添加网格显示
axes[0].grid(True, linestyle='--', alpha=0.5)
axes[1].grid(True, linestyle='-', alpha=0.5)
# 添加描述信息
axes[0].set_xlabel("时间")
axes[0].set_ylabel("温度")
axes[0].set_title("上海市中午11点0分到12点之间的温度变化图示")
axes[1].set_xlabel("时间")
axes[1].set_ylabel("温度")
axes[1].set_title("北京市中午11点0分到12点之间的温度变化图示")
# 显示图例
axes[0].legend()
axes[1].legend()
# 4. 显示图像
plt.show()
最终折线图如图:
6. 折线图应用场景
- 呈现公司产品(不同区域)每天活跃用户数
- 呈现 app 每天下载数量
- 呈现产品新功能上线后,用户点击次数随时间的变化
- 拓展:画各种数学函数图像 ◦ plt.plot() 除了可以画折线图外,也可以用于画各种数学函数图像
比如:
import numpy as np
import matplotlib.pyplot as plt
# 1. 准备数据
x = np.linspace(-10, 10, 1000)
y = np.sin(x)
# 2. 创建画布
plt.figure(figsize=(20,8), dpi=80)
# 3. 绘制函数图像
plt.plot(x, y)
# 4. 添加网格显示
plt.grid()
# 5. 显示图像
plt.show()
转载自:https://juejin.cn/post/7136855962287079432