Matplotlib详解(plt 和ax分别是什么)

news2024/11/24 19:53:16

Matplotlib中的plt 和 ax 分别是什么?

  • 概念引入
  • 两种绘图方式的区别
  • subplot 绘制
  • Matplotlib 常见组件设置整理
    • 4.1 设置显示中文字体
    • 4.2 设置标题
    • 4.3 边框的显示问题
    • 4.4 图例设置(legend)
    • 4.5 图形与边框之间的留白控制
    • 4.6 设置双坐标轴
    • 4.7 坐标轴相关设置
      • 4.7.1 设置x轴和y轴的范围
      • 4.7.2 设置横纵坐标轴的标签(名字)
      • 4.7.3 设置刻度和刻度标签
  • 5 网格线的设置

刚接触Matplotlib时,会被书上的plt、ax以及subplots等各种概念所迷惑,心里存在无数个问号,这些究竟是啥?画出来的图不是一样的吗?他们有啥区别?下面就一步步来解答这些迷惑。

概念引入

首先,我们应该要了解一张用Matplotlib画出来的图的具体构造,引用一张官方的图
在这里插入图片描述
我们先主要看图里面红色框的Figure和蓝色框的Axes,如何理解这两个东西呢?

如果将Matplotlib绘图和我们平常画画相类比,可以把Figure想象成一张纸(一般被称之为画布),Axes代表的则是纸中的一片区域(当然可以有多个区域,这是后续要说到的subplots),下面是一张更形象一点的图。

**
加粗样式
**
在Figure画布中,Axes1区域画了一张数据仪表盘,Axes2区域画了柱状图,Axes3区域绘制了一张地图,相信还是挺好理解的。

两种绘图方式的区别

对着两个概念有基本的了解后,就可以来看看plt.plot()和ax.plot()有何区别了,下面列出了两种用Matplotlib绘制图表的方式。

  • plt
# 第一种方式
plt.figure()
plt.plot([1,2,3,4,5],[2,4,6,8,10])
plt.show()
  • ax
# 第二种方式
fig,ax = plt.subplots()
ax.plot([1,2,3],[4,5,6])
plt.show()

绘图效果如下:
在这里插入图片描述
可以看到,不论是用plt.plot()还是ax.plot(),结果都是一样的

那区别在哪里?

从第一种方式的代码来看,先生成了一个Figure画布,然后在这个画布上隐式生成一个画图区域进行画图

第二种方式同时生成了Figure和axes两个对象,然后用ax对象在其区域内进行绘图

如果从面向对象编程(对理解Matplotlib绘图很重要)的角度来看,显然第二种方式更加易于解释,生成的fig和ax分别对画布Figure和绘图区域Axes进行控制,第一种方式反而显得不是很直观,如果涉及到子图零部件的设置,用第一种绘图方式会很难受。

在实际绘图时,也更推荐使用第二种方式

subplot 绘制

下面通过介绍subplots加深对第二种绘图方式的理解

假如现在我要在一张纸上左边画一个折线图,右边画一个散点图,该如何画呢?

首先要有一个画布Figure,其次,需要有两个区域Axes(等价于两个子图subplot)来画图

# 生成画布和axes对象
# nrows=1和ncols=2分别代表1行和两列
fig,ax = plt.subplots(nrows=1,ncols=2)

因为这里有两个画图区域,所以ax对应的是一个列表,存储了两个Axes 对象。

ax

在这里插入图片描述
然后分别控制左边和右边的绘图区域进行绘图

fig,ax = plt.subplots(nrows=1,ncols=2)
ax[0].plot([1,2,3],[4,5,6])
ax[1].scatter([1,2,3],[4,5,6])

在这里插入图片描述
其实到这里了也会发现,一个Axes对象对应了一个subplot子图,这些个子图都是画在同一个画布Figure之上。

Matplotlib 常见组件设置整理

个人认为用Matplotlib画出一张图来不难,难的是对于一些细节东西的设置,可能在一个小小的细节处理上就得百度好久,所以可以先点收藏了再看,需要的时候可以及时找出来看看。

先上一张官方绘制的关于各个组件在一张图中的名词解释,通过这张图可以很直观地感受到什么是legend,什么是tick……,遇到不会设置的也可以照着图搜索对应的文档,下面具体讲讲。
在这里插入图片描述
注: 下方的图片均使用fig,ax = plt.subplots()的方式生成

4.1 设置显示中文字体

Matplotlib中默认将中文显示为乱码的◻,如下面这种情况:

fig,ax = plt.subplots()
ax.plot(['北京','上海','深圳'],[1,3,5])
plt.show()

在这里插入图片描述
所以在绘图前可以通过下面的代码解决这个问题
plt.rcParams[‘font.sans-serif’] = [‘SimHei’]

# SimHei:微软雅黑
# FangSong:仿宋
# 这两个是我常用的,其他的可以上网搜一搜

fig,ax = plt.subplots()
ax.plot(['北京','上海','深圳'],[1,3,5])
plt.show()

在这里插入图片描述

4.2 设置标题

函数: ax.set_title
利用fontdict 和 loc 参数可以分别对字体和标题位置进行设置

plt.rcParams['font.sans-serif'] = ['SimHei']
fig,ax = plt.subplots()
ax.plot(['北京','上海','深圳'],[1,3,5])
ax.set_title('标题',fontdict={'size':16,'color':'red'},loc='center')
plt.show()

在这里插入图片描述

4.3 边框的显示问题

数:ax.spines[loc].set_visible(False)

一般的图表中,Matplotlib会默认显示出图形的spine,
就是图形上下左右的四条边线,如图
在这里插入图片描述
正常使用中有些时候仅仅需要左边left和底部bottom的spine,也有时候四条边框都不需要,可以这么设置:

plt.rcParams['font.sans-serif'] = ['SimHei']
fig,ax = plt.subplots()
ax.plot(['北京','上海','深圳'],[1,3,5])
ax.set_title('标题',fontdict={'size':16,'color':'red'},loc='center')
ax.spines['right'].set_visible(False)
ax.spines['top'].set_visible(False)
plt.show()

在这里插入图片描述

4.4 图例设置(legend)

函数:ax.legend()

图例是对图形所展示的内容的解释,比如在一张图中画了三条线,那么这三条线都代表了什么呢?这时就需要做点注释。

要显示图例可以有两种方式:

# 第一种:
# plot的时候加上label,之后调用ax.legend()
fig,ax = plt.subplots()
ax.plot(['北京','上海','深圳'],[1,3,5],label='2010')
ax.plot(['北京','上海','深圳'],[2,4,6],label='2020')
ax.legend()
plt.show()

# 第二种:
# 使用ax.legend()按顺序设置好图例
fig,ax = plt.subplots()
ax.plot(['北京','上海','深圳'],[1,3,5])
ax.plot(['北京','上海','深圳'],[2,4,6])
# frameon = False 设置不显示图例的边框
ax.legend(['2010','2020'],loc='upper center',fontsize=10,labelcolor='red',frameon=False)
plt.show()

在这里插入图片描述
frameon和fontsize参数可以设置是否显示图例的边框以及图例中文字的大小。
在这里插入图片描述

4.5 图形与边框之间的留白控制

函数:ax.margins()

不知道大家绘图的时候有没有发现,Matplotlib中默认在我们所画的图形和边框之间留有空白,比如
在这里插入图片描述

要去掉这样的空白部分可以使用ax.margins()进行设置

plt.rcParams['font.sans-serif'] = ['SimHei']
fig,ax = plt.subplots()
ax.plot(['北京','上海','深圳'],[1,3,5])
ax.set_title('标题',fontdict={'size':16,'color':'red'},loc='center')
ax.fill_between(['北京','上海','深圳'],[1,1,1],[1,3,5])
ax.margins(0)
plt.show()

在这里插入图片描述

4.6 设置双坐标轴

函数:ax.twinx()

双坐标轴一般用于复合图表,同时表示两种图表的指标量纲不一,经典的使用场景如帕累托图。

使用中,需要对原有的ax使用.twinx()方法生成ax2,再利用ax2进行绘图

fig,ax = plt.subplots()
ax.plot(['北京','上海','深圳'],[1,3,5],color='r')

# 双坐标用法
ax2 = ax.twinx()
ax2.bar(['北京','上海','深圳'],[20,40,60],alpha=0.3)

plt.show()

在这里插入图片描述

4.7 坐标轴相关设置

在一张二维图中,关于坐标轴各个零件的术语如图所示
在这里插入图片描述
首先有横坐标xaxis和纵坐标yaxis(注意与axes区分),横纵坐标上的标签(也可以说是横纵坐标的名字)为xlabel和ylabel,横纵坐标上有刻度线tick,刻度上对应的刻度标签则是tick label。
具体设置时所对应的函数为

  • ax.set_xlim(),ax.set_ylim() 设置x轴和y轴的范围
  • xlabel --> ax.set_xlabel()
  • ylabel --> ax.set_ylabel()
  • tick和tick label --> ax.tick_params,ax.xticks(),ax.yticks()

4.7.1 设置x轴和y轴的范围

set_xlim()、set_ylim()
Matplotlib会自动得出沿x、y(和z轴,如果是3D图)轴显示的变量的最小值和最大值。然而,可以通过使用set_xlim()和set_ylim()函数明确地设置限制。实例如下:

fig,ax = plt.subplots()
ax.scatter([3,2,1],[1,3,5],color='r')
ax.plot([3,2,1],[1,3,5],color='b')

在这里插入图片描述
设置x轴的范围:[0,4],y轴的范围:[0,6]

fig,ax = plt.subplots()
ax.scatter([3,2,1],[1,3,5],color='r')
ax.plot([3,2,1],[1,3,5],color='b')
ax.set_xlim([0,4])
ax.set_ylim([0,6])

在这里插入图片描述

4.7.2 设置横纵坐标轴的标签(名字)

fig,ax = plt.subplots()
ax.scatter([3,2,1],[1,3,5],color='r')
ax.plot([3,2,1],[1,3,5],color='b')

# 分别设置xy轴的标签
ax.set_xlabel('横轴',fontsize=10,color='red')
ax.set_ylabel('纵轴',fontsize=10,color='green')

在这里插入图片描述

4.7.3 设置刻度和刻度标签

fig,ax = plt.subplots()
ax.scatter([3,2,1],[1,3,5],color='r')
ax.plot([3,2,1],[1,3,5],color='b')

# fontsize设置刻度标签的大小
# direction控制刻度是朝内还是朝外显示
ax.tick_params(labelsize=14,direction='in')

在这里插入图片描述
设置刻度

fig,ax = plt.subplots()
ax.scatter([3,2,1],[1,3,5],color='r')
ax.plot([3,2,1],[1,3,5],color='b')

# fontsize设置刻度标签的大小
# direction控制刻度是朝内还是朝外显示
ax.tick_params(labelsize=19,direction='in')
ax.set_xticks([1,2,3,4,5])
ax.set_yticks([1,3,5,7,9])

在这里插入图片描述
设置刻度标签

fig,ax = plt.subplots()
ax.scatter([3,2,1],[1,3,5],color='r')
ax.plot([3,2,1],[1,3,5],color='b')

# fontsize设置刻度标签的大小
# direction控制刻度是朝内还是朝外显示
ax.tick_params(labelsize=19,direction='in')
ax.set_xticks([1,2,3,4,5])
ax.set_yticks([1,3,5,7,9])
ax.set_xticklabels(['a','b','c','d','e'])
ax.set_yticklabels(['一','二','三','四','五'])

在这里插入图片描述

5 网格线的设置

函数:ax.grid()

网格线多用于辅助查看具体的数值大小,横纵坐标都可以设置相应的网格线,视具体情况而论。

fig,ax1 = plt.subplots()
ax1.plot([1,2,3],[4,2,6],color='r')

# visible参数设置是否显示网格
# axis参数设置在哪个轴上显示网格线,可选参数为'x','y','both'
ax1.grid(visible=True,axis='y')

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1147474.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java毕业设计 SpringBoot 新能源充电桩管理系统

Java毕业设计 SpringBoot 新能源充电桩管理系统 SpringBoot 新能源充电桩管理系统 功能介绍 管理员 登录 验证码 注册 系统用户管理 普通用户管理 通知公告管理 留言管理 充电站管理 充电桩管理 充电桩预约 充电管理 订单管理 修改密码 普通用户 登录 修改个人资料 通知公告…

椭圆曲线在SM2中的应用(三)

一、SM2加密运算 1.1加密原始数据 SM2加密运算首先是用户A对数据加密,用户A拥有原始数据 椭圆曲线系统参数长度为klen比特的消息M公钥Pb椭圆曲线系统参数,已经在 椭圆曲线参数(二)中详细介绍;M就是需要加密消息,长度为klen; 1.1.1 公钥Pb的计算方式 公钥Pb=dBG,其中…

elasticsearch一些重要的配置参数

先看一下官网给我们提供的全部的参数配置项 官网地址 官方文档链接:注意版本是8.1Configuring Elasticsearch | Elasticsearch Guide [8.1] | Elastic​编辑https://www.elastic.co/guide/en/elasticsearch/reference/current/settings.html 重要(基本…

40.弗洛伊德(Floyd)算法

概述 我们此前拆解过迪杰斯特拉(Dijkstra)算法,与它一样,弗洛伊德(Floyd)算法也是用于寻找给定的加权图中顶点间最短路径的算法。该算法是1978年图灵奖获得者、斯坦福大学计算机科学系教授罗伯特弗洛伊德及…

【Linux】centos安装配置及远程连接工具的使用

🎉🎉欢迎来到我的CSDN主页!🎉🎉 🏅我是Java方文山,一个在CSDN分享笔记的博主。📚📚 🌟推荐给大家我的专栏《微信小程序开发实战》。🎯&#x1f3a…

私有云:【12】使用connention托管虚拟桌面

私有云:【12】使用connention托管虚拟桌面 1、使用connention托管虚拟桌面 1、使用connention托管虚拟桌面 使用cloudadmin用户登录connection服务器 登录connection客户端 创建桌面池 选择手动桌面池 选择vcenter虚拟机 选择vcenter.test.com 按如下选择下一步 设…

贝锐蒲公英旁路模式异地组网,不改动网络实现企业分部与总部互通

Micheal是一家快递公司的IT运维人员,因公司业务发展迅速,新增网点的速度非常快,各网点需将每天的数据都上传到总部服务器,及平时需要向总部服务器查询一些数据,总部的主路由是一台带有防火墙功能的企业路由&#xff0c…

共用体/联合体 的引入

概念 由一系列具有相同数据类型或者不同数据类型的数据组成的集合,数据互斥关系,共用体所有的成员共同使用一份内存空间,其中空间的大小是按照共用体成员中所占的最大的内存空间的成员的空间进行分配,即同一个内存空间存放类型不…

【PyQt学习篇 · ⑤】:QWidget - 鼠标操作

文章目录 鼠标形状设置常用鼠标形状设置自定义鼠标形状 重置形状获取鼠标鼠标跟踪鼠标跟踪案例 鼠标形状设置 常用鼠标形状设置 在PyQt中,QWidget类提供了设置鼠标形状的功能。可以使用setCursor()方法来更改QWidget及其子类的鼠标形状。该方法接受一个Qt.CursorS…

idea的设置

1.设置搜索encoding,所有编码都给换为utf-8 安装插件 eval-reset插件 https://www.yuque.com/huanlema-pjnah/okuh3c/lvaoxt#m1pdA 设置活动模板,idea有两种方式集成tomcat,一种是右上角config配置本地tomcat,一种是插件,如果使用插件集成,则在maven,pom.xml里面加上tomcat…

【uniapp】uniapp实现input输入显示数字键盘:

文章目录 一、官网文档:二、文档:三、效果:【1】number:iPhone原生数字键盘不显示小数点【2】digit:【3】digit和inputmode: 一、官网文档: input | uni-app官网 二、文档: 三、效果…

深度学习中Transformer的简单理解

Transformer 网络结构 Transformer也是由编码器和解码器组成的。 每一层Encoder编码器都由很多层构成的,编码器内又是self-attention和前馈网络构成的。Self-attention是用来做加权平均,前馈网络用来组合。 但是decoder有点不同,多了一层En…

Vue 3 响应式对象:ref 和 reactive 的使用和区别

🎉🎉欢迎来到我的CSDN主页!🎉🎉 🏅我是尘缘,一个在CSDN分享笔记的博主。📚📚 👉点击这里,就可以查看我的主页啦!👇&#x…

私有云:【11】win10安装Agent客户端组件

私有云:【11】win10安装Agent客户端组件 1、配置IP及加入域2、安装Agent客户端组件3、生成win10快照 1、配置IP及加入域 配置ip及dns 修改计算机名且加入域 进行验证 加入成功 将cloudadmin用户加入管理员组 输入cloudadmin户名密码验证 2、安装Agent客户端组件 …

第八周实验记录

10月20日-10月22日工作: 复现S-NeRF代码,按照github的步骤进行,首先使用一个RTX3090显卡, 在下图步骤中:运行最后一步 python scripts/run.py 出现问题 继续使用两张RTX3090显卡尝试,依旧在这一步出现问…

如何防范AI等技术带来的诈骗风险?从技术、法律、教育等多方面入手

文章目录 前言什么是AI诈骗案例案例一案例二 AI诈骗的特点如何预防和应对AI诈骗建议后记 前言 互联网是一把双刃剑,这是我们常说的一个问题。 随着人工智能技术的快速发展,AI诈骗成为当今社会面临的新兴威胁。不法分子利用人工智能技术,以更…

趣互联app一分购地推网推拉新上线平台啦,简单流程

趣互联一手渠道 “聚量推客” 上架趣互联啦,适合地推和网推进行推广,社群私域也可以推广,比较简单。 如果你在做拉新推广 地推或者网推都可以通过“聚量推客”获取最大收益

SDXL简介

SDXL是一个文生图模型。相比旧版的stable diffusion,SDXL主要的不同有三点: 有一个refinement model,通过image-to-image的方式来提高视觉保真度。使用了两个text encoder,OpenCLIP ViT-bigG和CLIP ViT-L。增加了图片大小和长宽比…