机器学习--Matplotlib

机器学习--Matplotlib

Matplotlib

  • 是专门用于开发2D图表(包括3D图表)
  • 以渐进、交互式方式实现数据可视化

简单的Matplotlib 画图 --- 以折线图为例

matplotlib.pyplot模块

matplotlib.pytplot包含了一系列类似于matlab的画图函数。

python 复制代码
import matplotlib.pyplot as plt

图形绘制流程:

1.创建画布 -- plt.figure()

python 复制代码
plt.figure(figsize=(), dpi=)
	figsize:指定图的长宽
	dpi:图像的清晰度
	返回fig对象

2.绘制图像 -- plt.plot(x, y)

markdown 复制代码
以折线图为例

3.显示图像 -- plt.show()

折线图绘制与显示

举例:展现上海一周的天气**,**比如从星期一到星期日的天气温度如下:

python 复制代码
import matplotlib.pyplot as plt
# 1.创建画布
plt.figure(figsize=(10, 10), dpi=100)
# 2.绘制折线图
plt.plot([1, 2, 3, 4, 5, 6 ,7], [17,17,18,15,11,11,13])
# 3.显示图像
plt.show()

Matplotlib图像结构

例子:一个完整的流程

我们通过天气温度变化的绘图来融合所有的基础API使用

需求:画出某城市11 点到121 小时内每分钟的温度变化折线图,温度范围在15度**~18**度效果:

准备数据并画出初始折线图

python 复制代码
import matplotlib.pyplot as plt
import random
# 画出温度变化图
# 0.准备x, y坐标的数据
x = range(60)
y_shanghai = [random.uniform(15, 18) for i in x]
# 1.创建画布
plt.figure(figsize=(20, 8), dpi=80)
# 2.绘制折线图
plt.plot(x, y_shanghai)
# 3.显示图像
plt.show()

添加自定义x,y刻度

  • plt.xticks(x, **kwargs)
    • x:要显示的刻度值
  • plt.yticks(y, **kwargs)
    • y:要显示的刻度值
python 复制代码
# 增加以下两行代码
# 构造x轴刻度标签
x_ticks_label = ["11点{}分".format(i) for i in x]
# 构造y轴刻度
y_ticks = range(40)
# 修改x,y轴坐标的刻度显示
plt.xticks(x[::5], x_ticks_label[::5])
plt.yticks(y_ticks[::5])

ps:如果没有解决过中文问题的话,会显示这个样子:

中文显示问题解决

解决方案一:

下载中文字体(黑体,看准系统版本)

  • 步骤一:下载 SimHei 字体(或者其他的支持中文显示的字体也行)

步骤二:安装字体

linux下:拷贝字体到 usr/share/fonts 下:

shell 复制代码
sudo cp ~/SimHei.ttf /usr/share/fonts/SimHei.ttf

windows和mac下:双击安装

步骤三:删除~/.matplotlib中的缓存文件

shell 复制代码
cd ~/.matplotlib
rm -r *

步骤四:修改配置文件matplotlibrc

shell 复制代码
vi ~/.matplotlib/matplotlibrc

将文件内容修改为:

shell 复制代码
font.family : sans-serif
font.sans-serif : SimHei
axes.unicode_minus : False

解决方案二:

在Python脚本中动态设置matplotlibrc,这样也可以避免由于更改配置文件而造成的麻烦,具体代码如下:

shell 复制代码
from pylab import mpl
\# 设置显示中文字体
mpl.rcParams["font.sans-serif"] = ["SimHei"]

有时候,字体更改后,会导致坐标轴中的部分字符无法正常显示,此时需要更改axes.unicode_minus参数:

shell 复制代码
# 设置正常显示符号
mpl.rcParams["axes.unicode_minus"] = False

添加网格显示

为了更加清楚地观察图形对应的值

python 复制代码
plt.grid(True, linestyle='--', alpha=0.5)

添加描述信息

添加x轴、y轴描述信息及标题

  • 通过fontsize参数可以修改图像中字体的大小
python 复制代码
plt.xlabel("时间")
plt.ylabel("温度")
plt.title("中午11点0分到12点之间的温度变化图示", fontsize=20)

图像保存

保存图片到指定路径

python 复制代码
plt.savefig("test.png")

注意:plt.show()会释放figure资源,如果在显示图像之后保存图片将只能保存空图片。

完整代码:

python 复制代码
import matplotlib.pyplot as plt
import random
from pylab import mpl

# 设置显示中文字体
mpl.rcParams["font.sans-serif"] = ["SimHei"]
# 设置正常显示符号
mpl.rcParams["axes.unicode_minus"] = False
# 0.准备数据
x = range(60)
y_shanghai = [random.uniform(15, 18) for i in x]
# 1.创建画布
plt.figure(figsize=(20, 8), dpi=100)
# 2.绘制图像
plt.plot(x, y_shanghai)
# 2.1 添加x,y轴刻度
# 构造x,y轴刻度标签
x_ticks_label = ["11点{}分".format(i) for i in x]
y_ticks = range(40)
# 刻度显示
plt.xticks(x[::5], x_ticks_label[::5])
plt.yticks(y_ticks[::5])
# 2.2 添加网格显示
plt.grid(True, linestyle="--", alpha=0.5)
# 2.3 添加描述信息
plt.xlabel("时间")
plt.ylabel("温度")
plt.title("中午11点--12点某城市温度变化图", fontsize=20)
# 2.4 图像保存
plt.savefig("./test.png")
# 3.图像显示
plt.show()

例子:在一个坐标系中绘制多个图像

多次plot

需求:再添加一个城市的温度变化

收集到北京当天温度变化情况,温度在1度到3度。怎么去添加另一个在同一坐标系当中的不同图形,其实很简单只需要再次plot即可,但是需要区分线条,如下显示:

python 复制代码
# 增加北京的温度数据
y_beijing = [random.uniform(1, 3) for i in x]
# 绘制折线图
plt.plot(x, y_shanghai)
# 使用多次plot可以画多个折线
plt.plot(x, y_beijing, color='r', linestyle='--')

我们仔细观察,用到了两个新的地方,一个是对于不同的折线展示效果,一个是添加图例。

设置图形风格

颜色和线的类型

颜色标记 描述
'r' 红色
'g' 绿色
'b' 蓝色
'c' 青色
'm' 品红
'y' 黄色
'k' 黑色
'w' 白色
类型 简写 说明
'solid' (默认) '-' 实线
'dotted' ':' 点虚线
'dashed' '--' 破折线
'dashdot' '-.' 点划线
'None' '' 或 ' ' 不画线

显示图例

注意:如果只在plt.plot()中设置label还不能最终显示出图例,还需要通过plt.legend()将图例显示出来。

python 复制代码
# 绘制折线图
plt.plot(x, y_shanghai, label="上海")
\# 使用多次plot可以画多个折线
plt.plot(x, y_beijing, color='r', linestyle='--', label="北京")

\# 显示图例
plt.legend(loc="best")

完整代码

python 复制代码
# 0.准备数据
x = range(60)
y_shanghai = [random.uniform(15, 18) for i in x]
y_beijing = [random.uniform(1,3) for i in x]
# 1.创建画布
plt.figure(figsize=(20, 8), dpi=100)
# 2.绘制图像
plt.plot(x, y_shanghai, label="上海")
plt.plot(x, y_beijing, color="r", linestyle="--", label="北京")
# 2.1 添加x,y轴刻度
# 构造x,y轴刻度标签
x_ticks_label = ["11点{}分".format(i) for i in x]
y_ticks = range(40)
# 刻度显示

plt.xticks(x[::5], x_ticks_label[::5])
plt.yticks(y_ticks[::5])
# 2.2 添加网格显示
plt.grid(True, linestyle="--", alpha=0.5)
# 2.3 添加描述信息
plt.xlabel("时间")
plt.ylabel("温度")
plt.title("中午11点--12点某城市温度变化图", fontsize=20)
# 2.4 图像保存
plt.savefig("./test.png")
# 2.5 添加图例
plt.legend(loc=0)
# 3.图像显示
plt.show()

例子:多个坐标系显示**--- plt.subplots(面向对象的画图方法)**

如果我们想要将上海和北京的天气图显示在同一个图的不同坐标系当中,效果如下:

可以通过subplots函数实现(旧的版本中有subplot,使用起来不方便),推荐subplots函数

  • matplotlib.pyplot.subplots(nrows=1, ncols=1, **fig_kw) 创建一个带有多个axes(坐标系/绘图区)的图
python 复制代码
Parameters:
nrows, ncols : 设置有几行几列坐标系
	int, optional, default: 1, Number of rows/columns of the subplot grid.

Returns:
fig : 图对象
axes : 返回相应数量的坐标系

设置标题等方法不同:
	set_xticks
	set_yticks
	set_xlabel
	set_ylabel

关于axes子坐标系的更多方法:参考https://matplotlib.org/api/axes_api.html#matplotlib.axes.Axes

注意:**plt.函数名 ()**相当于面向过程的画图方法,**axes.set_方法名()**相当于面向对象的画图方法

python 复制代码
# 0.准备数据
x = range(60)
y_shanghai = [random.uniform(15, 18) for i in x]
y_beijing = [random.uniform(1, 5) for i in x]
# 1.创建画布
# plt.figure(figsize=(20, 8), dpi=100)
fig, axes = plt.subplots(nrows=1, ncols=2, figsize=(20, 8), dpi=100)

# 2.绘制图像
# plt.plot(x, y_shanghai, label="上海")
# plt.plot(x, y_beijing, color="r", linestyle="--", label="北京")
axes[0].plot(x, y_shanghai, label="上海")
axes[1].plot(x, y_beijing, color="r", linestyle="--", label="北京")

# 2.1 添加x,y轴刻度
# 构造x,y轴刻度标签
x_ticks_label = ["11点{}分".format(i) for i in x]
y_ticks = range(40)
# 刻度显示
# plt.xticks(x[::5], x_ticks_label[::5])
# plt.yticks(y_ticks[::5])
axes[0].set_xticks(x[::5])
axes[0].set_yticks(y_ticks[::5])
axes[0].set_xticklabels(x_ticks_label[::5])
axes[1].set_xticks(x[::5])
axes[1].set_yticks(y_ticks[::5])
axes[1].set_xticklabels(x_ticks_label[::5])

# 2.2 添加网格显示
# plt.grid(True, linestyle="--", alpha=0.5)
axes[0].grid(True, linestyle="--", alpha=0.5)
axes[1].grid(True, linestyle="--", alpha=0.5)

# 2.3 添加描述信息
# plt.xlabel("时间")
# plt.ylabel("温度")
# plt.title("中午11点--12点某城市温度变化图", fontsize=20)
axes[0].set_xlabel("时间")
axes[0].set_ylabel("温度")
axes[0].set_title("中午11点--12点某城市温度变化图", fontsize=20)
axes[1].set_xlabel("时间")
axes[1].set_ylabel("温度")
axes[1].set_title("中午11点--12点某城市温度变化图", fontsize=20)

# # 2.4 图像保存
plt.savefig("./test.png")

# # 2.5 添加图例
# plt.legend(loc=0)
axes[0].legend(loc=0)
axes[1].legend(loc=0)

# 3.图像显示
plt.show()

折线图的应用场景

  • 呈现公司产品(不同区域)每天活跃用户数
  • 呈现app每天下载数量
  • 呈现产品新功能上线后,用户点击次数随时间的变化
  • 拓展:画各种数学函数图像
    • 注意:plt.plot()除了可以画折线图,也可以用于画各种数学函数图像
python 复制代码
import numpy as np
# 0.准备数据
x = np.linspace(-10, 10, 1000)
y = np.sin(x)

# 1.创建画布
plt.figure(figsize=(20, 8), dpi=100)

# 2.绘制函数图像
plt.plot(x, y)
# 2.1 添加网格显示
plt.grid()

# 3.显示图像
plt.show()

小结

  • 添加x,y轴刻度
    • plt.xticks()
    • plt.yticks()
    • 注意**:在传递进去的第一个参数必须是数字 ,不能是字符串 ,如果是字符串吗,**需要进行替换操作
  • 添加网格显示
    • plt.grid(linestyle="--", alpha=0.5)
  • 添加描述信息
    • plt.xlabel()
    • plt.ylabel()
    • plt.title()
  • 图像保存
    • plt.savefig("路径")
  • 多次plot
    • 直接进行添加就OK
  • 显示图例
    • plt.legend(loc="best")
    • 注意**:一定要在 plt.plot()里面设置一个 label,如果不设置,**没法显示
  • 多个坐标系显示
    • plt.subplots(nrows=, ncols=)
  • 折线图的应用
    • 1.应用于观察数据的变化
    • 2.可是画出一些数学函数图像

更详细的教程:Matplotlib 教程 | 菜鸟教程 (runoob.com)

相关推荐
Trouvaille ~5 分钟前
【机器学习】从流动到恒常,无穷中归一:积分的数学诗意
人工智能·python·机器学习·ai·数据分析·matplotlib·微积分
dundunmm13 分钟前
论文阅读:Deep Fusion Clustering Network With Reliable Structure Preservation
论文阅读·人工智能·数据挖掘·聚类·深度聚类·图聚类
szxinmai主板定制专家22 分钟前
【国产NI替代】基于FPGA的4通道电压 250M采样终端边缘计算采集板卡,主控支持龙芯/飞腾
人工智能·边缘计算
是十一月末22 分钟前
Opencv实现图像的腐蚀、膨胀及开、闭运算
人工智能·python·opencv·计算机视觉
云空29 分钟前
《探索PyTorch计算机视觉:原理、应用与实践》
人工智能·pytorch·python·深度学习·计算机视觉
杭杭爸爸30 分钟前
无人直播源码
人工智能·语音识别
Ainnle2 小时前
微软 CEO 萨提亚・纳德拉:回顾过去十年,展望 AI 时代的战略布局
人工智能·microsoft
长风清留扬2 小时前
基于OpenAI Whisper AI模型自动生成视频字幕:全面解析与实战指南
人工智能·神经网络·opencv·计算机视觉·自然语言处理·数据挖掘·whisper
灰太狼不爱写代码4 小时前
CUDA11.4版本的Pytorch下载
人工智能·pytorch·笔记·python·学习
volcanical6 小时前
Dataset Distillation with Attention Labels for Fine-tuning BERT
人工智能·深度学习·bert