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

刚接触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')

在这里插入图片描述

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: `ax.text()` 是 Matplotlib 库中的一个函数,用于在图形中添加文本。 函数的语法如下: `ax.text(x, y, s, fontdict=None, withdash=False, **kwargs)` 参数说明: - `x` 和 `y`:文本的横向和纵向坐标。 - `s`:要显示的文本内容。 - `fontdict`:可选参数,用于设置文本样式的字典。例如,`fontdict={'fontsize': 12, 'color': 'red', 'weight': 'bold'}` 可以设置文本的字体大小、颜色、粗细等。 - `withdash`:可选参数,当 `withdash=True` 时,在文本后添加一个虚线指示符。 - `**kwargs`:其他可选参数,用于设置文本样式的关键字参数。例如,`backgroundcolor='yellow'` 可以设置文本的背景色。 该函数将返回一个 `matplotlib.text.Text` 对象,可以通过该对象对添加的文本进行进一步的设置,例如设置对齐方式、旋转角度等。 使用 `ax.text()` 可以在 Matplotlib 的图形上任意位置添加文本标注。可以用于添加图形的标题、数据标签、图例等。通过设置不同的参数,可以自定义文本的位置、样式,并且可以支持多种文字效果。 例如,以下代码片段会在 Matplotlib 的图形上添加一个标注为 "Hello World" 的文本框,并且将字体颜色设置为红色、字体大小设置为12,并且设置文本框的背景色为黄色: ```python import matplotlib.pyplot as plt fig, ax = plt.subplots() ax.text(0.5, 0.5, "Hello World", fontdict={'fontsize': 12, 'color': 'red'}, backgroundcolor='yellow') plt.show() ``` 总结来说,`ax.text()` 是一个非常有用的函数,通过它可以方便地向图形中添加文本标注,并且可以对文本的位置、样式进行自定义。 ### 回答2: ax.text是matplotlib库的一个函数,它可以在图形的指定位置添加文本注释。 使用ax.text函数需要指定以下几个参数: 1. x和y:指定文本注释的位置坐标,分别表示注释在x轴和y轴上的位置。 2. s:指定文本注释的内容,可以是字符串。 3. fontsize:设置文本注释的字体大小。 4. color:设置文本注释的颜色。 5. verticalalignment和horizontalalignment:设置文本注释的垂直对齐和水平对齐方式。 除了上述的必要参数之外,ax.text函数还可以接受其他可选参数来进一步控制文本注释的样式,例如: 1. bbox:通过指定bbox参数,可以为文本注释添加边框。 2. fontweight和fontstyle:可以控制文本注释的字体加粗和样式。 3. rotation:可以设置文本注释的旋转角度。 4. ha和va:可以分别设置水平和垂直对齐方式。 5. alpha:可以设置文本注释的透明度。 总结起来,ax.text函数可以让我们在matplotlib图形的指定位置添加文本注释,通过调整各种参数可以进一步控制文本注释的样式和位置。这个函数在数据可视化中常用于给图形添加标签、注释和解释等,能够提高图形的可读性和美观度。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值