欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 汽车 > 维修 > 机器学习 Day02,matplotlib库绘图

机器学习 Day02,matplotlib库绘图

2025/3/11 19:36:10 来源:https://blog.csdn.net/qq_66246715/article/details/146117388  浏览:    关键词:机器学习 Day02,matplotlib库绘图

1.matplotlib图像结构

  • 容器层:画板,画布,坐标系
  • 辅助层:刻度,标题,网格,图例等
  • 图像层:折线图(主讲),饼图,直方图,柱状图等等

2.基本画图框架

matplotlib.pyplot 模块。这是 Python 中一个用于数据可视化的强大模块,其中的函数与 Matlab 的绘图函数类似,方便易用,一般通过 import matplotlib.pyplot as plt 导入。

以下是使用 matplotlib.pyplot 绘图的标准流程:

创建画布:使用 plt.figure() 函数创建一个空白画布,如需自定义画布大小和分辨率,可这样写:

import matplotlib.pyplot as plt
# 创建一个宽为8英寸,高为6英寸,分辨率为100dpi的画布
fig = plt.figure(figsize=(8, 6), dpi=100) 

绘制图像:以折线图为例,假设我们有一组数据,使用 plt.plot() 函数进行绘制:

显示图像:使用 plt.show() 函数展示绘制好的图像

比如要展示上海一周的天气温度,代码如下:

import matplotlib.pyplot as plt
# 创建画布,宽和高都设为10英寸,分辨率100dpi
plt.figure(figsize=(10, 10), dpi=100) 
# 横坐标表示周一到周日
week_days = [1, 2, 3, 4, 5, 6 ,7] 
# 纵坐标表示对应每天的温度
temperatures = [17,17,18,15,11,11,13] 
# 绘制折线图
plt.plot(week_days, temperatures) 
# 显示图像
plt.show() 

3.基本修饰

3.1图的刻度

3.1.1准备数据并绘制初始折线图:如第二张图代码所示,先导入matplotlib.pyplotrandom模块。通过range(60)生成表示 60 分钟的横坐标数据x,使用random.uniform(15, 18)生成 15 到 18 度之间的随机温度数据y_shanghai作为纵坐标。接着创建一个宽 20 英寸、高 8 英寸、分辨率 100dpi 的画布,再用plt.plot(x, y_shanghai)绘制折线图。

import matplotlib.pyplot as plt
import randomx = range(60)
y_shanghai = [random.uniform(15, 18) for i in x]
plt.figure(figsize=(20, 8), dpi=100)
plt.plot(x, y_shanghai)

3.1.2添加 x,y 轴刻度

3.1.2.1生成刻度标签数据:如第三张图代码,对于 x 轴刻度标签,使用列表推导式["11点{}分".format(i) for i in x]生成从 “11 点 0 分” 到 “11 点 59 分” 的标签列表x_ticks_label;对于 y 轴刻度,简单使用range(40)生成从 0 到 39 的刻度值y_ticks

x_ticks_label = ["11点{}分".format(i) for i in x]
y_ticks = range(40)

3.1.2.2设置刻度显示 :在 Matplotlib 中不能直接用字符串修改坐标刻度,需同时传入刻度位置和对应的标签plt.xticks(x[::5], x_ticks_label[::5])表示每隔 5 个数据点设置一个 x 轴刻度标签,这样能避免刻度标签过于密集;plt.yticks(y_ticks[::5])表示每隔 5 个刻度值显示一个 y 轴刻度。

可以理解为第一个参数表示隔多少取一个刻度,而第二个参数表示显示什么和第一个参数意义对应。

plt.xticks(x[::5], x_ticks_label[::5])
plt.yticks(y_ticks[::5])

3.1.3显示图像

plt.show()

注意,这个库中想要显示中文字体要进行如下操作

from pylab import mpl# 设置显示中文字体为黑体
mpl.rcParams["font.sans-serif"] = ["SimHei"]
# 设置正常显示符号
mpl.rcParams["axes.unicode_minus"] = False

3.2 添加网格线和标题坐标轴

3.2.1. 添加网格显示

使用plt.grid()函数可以为图形添加网格,方便更清晰地观察图形对应的值。以下是示例代码:

import matplotlib.pyplot as plt
import random# 准备数据
x = range(60)
y = [random.uniform(15, 18) for _ in x]# 创建画布
plt.figure(figsize=(10, 6), dpi=100)# 绘制折线图
plt.plot(x, y)# 添加网格显示
plt.grid(True, linestyle='--', alpha=0.5) 
# True表示显示网格;linestyle='--'设置网格线为虚线;alpha=0.5设置网格线透明度为0.5# 显示图像
plt.show()

在上述代码中,首先导入必要的模块,然后生成模拟的时间和温度数据。创建画布并绘制折线图后,通过plt.grid()函数添加网格,按照第一张图中的参数设置,让网格以虚线形式、50% 的透明度显示在图形上。

3.2.2. 添加描述信息

使用plt.xlabel()plt.ylabel()plt.title()函数分别为图形添加 x 轴标签、y 轴标签和标题,同时可以通过fontsize参数调整字体大小。示例代码如下:

import matplotlib.pyplot as plt
import random# 准备数据
x = range(60)
y = [random.uniform(15, 18) for _ in x]# 创建画布
plt.figure(figsize=(10, 6), dpi=100)# 绘制折线图
plt.plot(x, y)# 添加网格显示
plt.grid(True, linestyle='--', alpha=0.5) # 添加描述信息
plt.xlabel("时间", fontsize=12)  # 添加x轴标签并设置字体大小为12
plt.ylabel("温度", fontsize=12)  # 添加y轴标签并设置字体大小为12
plt.title("中午11点0分到12点之间的温度变化图示", fontsize=20) 
# 添加标题并设置字体大小为20# 显示图像
plt.show()

3.3 图片保存

import matplotlib.pyplot as plt
import random# 准备数据
x = range(60)
y = [random.uniform(15, 18) for _ in x]# 创建画布
plt.figure(figsize=(10, 6), dpi=100)# 绘制折线图
plt.plot(x, y)# 添加网格显示
plt.grid(True, linestyle='--', alpha=0.5)# 添加描述信息
plt.xlabel("时间")
plt.ylabel("温度")
plt.title("中午11点到12点温度变化图")# 保存图像,指定保存路径和文件名,这里保存在当前目录下为test.png
plt.savefig("test.png")# 显示图像
plt.show()
  • 保存图像的方法:使用plt.savefig()函数可以将绘制好的图像保存到指定路径。如代码plt.savefig("test.png"),表示将图像以test.png文件名保存,文件格式为 PNG。你可以根据需要修改文件名和路径,如plt.savefig("C:/images/weather_chart.jpg") ,将图像保存到 C 盘的 images 文件夹下,格式为 JPEG。
  • 注意事项plt.show()会释放figure资源,如果先执行plt.show()再保存图片,保存的将是一张空图片。因此,建议在调用plt.show()之前先调用plt.savefig()保存图像。

4.一张图绘制多个图像,添加图例

import matplotlib.pyplot as plt
import random# 准备横坐标数据,表示11点到12点的60分钟
x = range(60)# 准备上海的温度数据,在15到18度之间随机取值
y_shanghai = [random.uniform(15, 18) for _ in x]# 准备北京的温度数据,在1到3度之间随机取值
y_beijing = [random.uniform(1, 3) for _ in x]# 创建画布
plt.figure(figsize=(10, 6), dpi=100)# 绘制上海的温度变化折线图
plt.plot(x, y_shanghai, label='上海')# 绘制北京的温度变化折线图,设置颜色为红色,线条样式为虚线
plt.plot(x, y_beijing, color='r', linestyle='--', label='北京')# 添加网格显示,方便观察数据
plt.grid(True, linestyle='--', alpha=0.5)# 添加x轴、y轴标签和标题
plt.xlabel("时间")
plt.ylabel("温度")
plt.title("中午11点到12点城市温度变化图")# 添加图例,显示每条折线对应的城市名称
plt.legend()# 保存图像
plt.savefig("city_temperature.png")# 显示图像
plt.show()
  1. 导入模块:开头导入matplotlib.pyplot用于绘图,random用于生成随机温度数据。
  2. 数据准备:分别生成表示 60 分钟的横坐标数据x,以及上海和北京的温度数据y_shanghaiy_beijing,这些数据都是随机生成的模拟值。
  3. 创建画布:使用plt.figure()创建一个指定大小和分辨率的画布。
  4. 绘制图像
    • 第一次调用plt.plot()绘制上海的温度变化折线图,并通过label参数设置标签为 “上海”。
    • 第二次调用plt.plot()绘制北京的温度变化折线图,通过color参数设置线条颜色为红色,linestyle参数设置线条样式为虚线,同时也设置了label为 “北京”,方便后续添加图例。
  5. 添加辅助元素
    • 使用plt.grid()添加网格,使图形数据更易观察。
    • 使用plt.xlabel()plt.ylabel()plt.title()分别添加 x 轴标签、y 轴标签和标题。
    • 使用plt.legend()添加图例,根据之前plot函数中设置的label,自动显示每条折线对应的城市名称。
  6. 保存和显示图像:先使用plt.savefig()保存图像,再使用plt.show()显示图像,注意保存要在显示之前,避免保存到空图。

显示图例函数

plt.legend()函数,用于在 Matplotlib 绘制的图形中显示图例:

  • 基本作用:当在一个坐标系中绘制多个图形时,plt.legend()能根据plt.plot()等绘图函数中设置的label参数,展示每个图形对应的标签说明,方便区分不同图形代表的数据 。
  • 使用方法
    • 首先在绘图函数(如plt.plot() )中通过label参数为图形设置标签,例如plt.plot(x, data1, label="数据1") 、plt.plot(x, data2, label="数据2") 。
    • 然后调用plt.legend()显示图例。若仅写plt.legend() ,会使用默认设置显示图例;若要指定图例位置,可使用loc参数,如plt.legend(loc="best") 让系统自动选最佳位置,loc还支持多种取值,图片中的表格列出了位置字符串(如'upper right' )和对应的位置代码(如1 )。
  • 注意事项:只在plt.plot()中设置label不能直接显示图例,必须调用plt.legend()才能将图例呈现在图形上。

至此画一个简单的图已经完善,这是完整代码:

import matplotlib.pyplot as plt
import random# 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.legend(loc=0)# 2.5 图像保存
plt.savefig("./test.png")# 3.图像显示
plt.show()

5.多个坐标系显示多个图

其实差不多,只不过是调用对象不一样,调用的方法有差别。

  • 当需要将多个数据可视化结果展示在同一幅图的不同坐标系中时,可使用plt.subplots函数。如想同时展示上海和北京中午 11 点到 12 点的天气温度变化图,就可利用该函数。
  • 函数介绍matplotlib.pyplot.subplots(nrows=1, ncols=1, **fig_kw),其中nrowsncols用于设置子图的行数和列数,默认都为 1;该函数返回两个值,fig代表整个图像对象,axes返回相应数量的坐标系对象。所以需要两个变量去接收,之后可以用axes这个变量当做每个子图去使用,见代码。
  • axes数组表示方法:

    axes数组的索引从 0 开始,通过axes[row_index, col_index]来定位特定的子坐标系,其中row_index是行索引,col_index是列索引。例如:axes[0, 0]:表示第 1 行第 1 列的子坐标系。axes[0, 1]:表示第 1 行第 2 列的子坐标系。axes[1, 0]:表示第 2 行第 1 列的子坐标系。axes[1, 1]:表示第 2 行第 2 列的子坐标系。

  • 设置方法差异:相比之前直接用plt的方式,面向对象的方法中设置坐标轴刻度、标签等需通过axes对象的方法,如set_xticks(设置 x 轴刻度)、set_xlabel(设置 x 轴标签)等。
  • 代码示例讲解
    • 创建画布fig, axes = plt.subplots(nrows=1, ncols=2, figsize=(20, 8), dpi=100),创建了一个包含 1 行 2 列子图的画布,宽 20 英寸,高 8 英寸,分辨率 100dpi,fig为整个图像对象,axes是包含两个子坐标系对象的数组。
    • 绘制图像:通过axes[0].plot(x, y_shanghai, label="上海")在第一个子坐标系绘制上海温度变化图 ;axes[1].plot(x, y_beijing, color="r", linestyle="--", label="北京")在第二个子坐标系绘制北京温度变化图。
import matplotlib.pyplot as plt
import random# 准备数据
x = range(60)
y_shanghai = [random.uniform(15, 18) for i in x]
y_beijing = [random.uniform(1, 3) for i in x]# 创建画布
fig, axes = plt.subplots(nrows=1, ncols=2, figsize=(20, 8), dpi=100)# 绘制图像
axes[0].plot(x, y_shanghai, label="上海")
axes[1].plot(x, y_beijing, color="r", linestyle="--", label="北京")# 为第一个子图添加辅助元素
axes[0].set_title("上海中午11点--12点温度变化图")
axes[0].set_xlabel("时间")
axes[0].set_ylabel("温度")
axes[0].grid(True, linestyle="--", alpha=0.5)
axes[0].legend()# 为第二个子图添加辅助元素
axes[1].set_title("北京中午11点--12点温度变化图")
axes[1].set_xlabel("时间")
axes[1].set_ylabel("温度")
axes[1].grid(True, linestyle="--", alpha=0.5)
axes[1].legend()# 显示图像
plt.show()

但是这里注意在显示刻度的时候有一个差别,它不能像唯一一个图一样用两个参数去做,而需要拆分为两个函数

这是一个图 这是多个图:

import matplotlib.pyplot as plt
import random# 准备横坐标数据,表示11点到12点的60分钟
x = range(60)
# 准备上海的温度数据,在15到18度之间随机取值
y_shanghai = [random.uniform(15, 18) for _ in x]
# 准备北京的温度数据,在1到3度之间随机取值
y_beijing = [random.uniform(1, 3) for _ in x]# 创建2×1的子图布局
fig, axes = plt.subplots(nrows=2, ncols=1, figsize=(10, 8))# 绘制图像
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)# 修改x,y轴坐标刻度显示
axes[0].set_xticks(x[::5])  # 为第一个子坐标系的x轴每隔5个数据点设置一个刻度
axes[0].set_yticks(y_ticks[::5])  # 为第一个子坐标系的y轴每隔5个刻度值设置一个刻度
axes[0].set_xticklabels(x_ticks_label[::5])  # 为第一个子坐标系的x轴刻度设置对应标签,每隔5个刻度显示一个axes[1].set_xticks(x[::5])  # 为第二个子坐标系的x轴每隔5个数据点设置一个刻度
axes[1].set_yticks(y_ticks[::5])  # 为第二个子坐标系的y轴每隔5个刻度值设置一个刻度
axes[1].set_xticklabels(x_ticks_label[::5])  # 为第二个子坐标系的x轴刻度设置对应标签,每隔5个刻度显示一个# 显示图像
plt.show()
  • 对于第一个子坐标系(axes[0]
    • axes[0].set_xticks(x[::5]):设置 x 轴刻度位置,每隔 5 个数据点显示一个刻度 ,x[::5]表示从x中每隔 5 个元素取一个。
    • axes[0].set_yticks(y_ticks[::5]):设置 y 轴刻度位置,每隔 5 个刻度值显示一个刻度 ,y_ticks[::5]表示从y_ticks中每隔 5 个元素取一个。
    • axes[0].set_xticklabels(x_ticks_label[::5]):设置 x 轴刻度标签,与set_xticks配合,每隔 5 个刻度显示对应的标签。
  • 对于第二个子坐标系(axes[1]
    • axes[1].set_xticks(x[::5])axes[1].set_yticks(y_ticks[::5]) 、axes[1].set_xticklabels(x_ticks_label[::5]) :作用与在axes[0]中的设置类似,分别设置第二个子坐标系的 x 轴刻度位置、y 轴刻度位置以及 x 轴刻度标签 。

 这是整体代码:

import matplotlib.pyplot as plt
import random# 0. 准备数据
# 生成表示60分钟的时间序列,作为横坐标数据
x = range(60)
# 生成上海的温度数据,每个数据在15到18度之间随机取值
y_shanghai = [random.uniform(15, 18) for i in x]
# 生成北京的温度数据,每个数据在1到3度之间随机取值
y_beijing = [random.uniform(1, 3) for i in x]# 1. 创建画布
# 创建一个1行2列的子图布局,设置画布大小为宽20英寸,高8英寸,分辨率为100dpi
fig, axes = plt.subplots(nrows=1, ncols=2, figsize=(20, 8), dpi=100)# 2. 绘制图像
# 在第一个子坐标系中绘制上海的温度变化折线图,并添加标签
axes[0].plot(x, y_shanghai, label="上海")
# 在第二个子坐标系中绘制北京的温度变化折线图,设置颜色为红色,线条样式为虚线,并添加标签
axes[1].plot(x, y_beijing, color="r", linestyle="--", label="北京")# 2.1 添加x,y轴刻度
# 构造x轴刻度标签,格式为“11点几分”
x_ticks_label = ["11点{}分".format(i) for i in x]
# 生成y轴刻度值,范围是0到39
y_ticks = range(40)# 修改x,y轴坐标刻度显示
# 为第一个子坐标系的x轴每隔5个数据点设置一个刻度
axes[0].set_xticks(x[::5])
# 为第一个子坐标系的y轴每隔5个刻度值设置一个刻度
axes[0].set_yticks(y_ticks[::5])
# 为第一个子坐标系的x轴刻度设置对应标签,每隔5个刻度显示一个
axes[0].set_xticklabels(x_ticks_label[::5])# 为第二个子坐标系的x轴每隔5个数据点设置一个刻度
axes[1].set_xticks(x[::5])
# 为第二个子坐标系的y轴每隔5个刻度值设置一个刻度
axes[1].set_yticks(y_ticks[::5])
# 为第二个子坐标系的x轴刻度设置对应标签,每隔5个刻度显示一个
axes[1].set_xticklabels(x_ticks_label[::5])# 2.2 添加网格显示
# 为第一个子坐标系添加虚线网格,不透明度为1(完全不透明)
axes[0].grid(True, linestyle="--", alpha=1)
# 为第二个子坐标系添加虚线网格,不透明度为1(完全不透明)
axes[1].grid(True, linestyle="--", alpha=1)# 2.3 添加描述信息
# 为第一个子坐标系设置x轴标签为“时间”
axes[0].set_xlabel("时间")
# 为第一个子坐标系设置y轴标签为“温度”
axes[0].set_ylabel("温度")
# 为第一个子坐标系设置标题为“中午11点-12点某城市温度变化图”,字体大小为20
axes[0].set_title("中午11点-12点某城市温度变化图", fontsize=20)# 为第二个子坐标系设置x轴标签为“时间”
axes[1].set_xlabel("时间")
# 为第二个子坐标系设置y轴标签为“温度”
axes[1].set_ylabel("温度")
# 为第二个子坐标系设置标题为“中午11点-12点某城市温度变化图”,字体大小为20
axes[1].set_title("中午11点-12点某城市温度变化图", fontsize=20)# 2.4 显示图例
# 在第一个子坐标系中显示图例,位置自动选择最佳
axes[0].legend(loc=0)
# 在第二个子坐标系中显示图例,位置自动选择最佳
axes[1].legend(loc=0)# 2.5 图像保存
# 将绘制好的图像保存为当前目录下的test.png文件
plt.savefig("./test.png")# 3. 图像显示
# 显示绘制好的图形
plt.show()

6.对于其他图只是创建时把plot改一下并且后面参数对应即可,自己可查 

记一下:

plt.figure(figsize=(长,宽),dpi=清晰度)创建画布

plt.plot(x,y)

plt.x/yticks()掌控刻度,不可直接中文

plt.x/ylable()掌握坐标标题

plt.title()掌握标题

plt.grid(True,linestyle="样式",alpha=透明度)掌握网格线

plt.legend(loc="")掌握图例,在plot里加lable

plt.show()展示

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词