matplotlib绘图分析
解释:
Figure
:图形绘制的画板,他就相当于一个黑板,所有的图都是绘制在Figure
上面。Axes
:每个图都是Axes
对象。一个Figure
上可以有多个Axes
对象。Axis
:x
轴、y
轴的对象。Tick
:x
轴和y
轴上的刻度对象。每一个刻度都是一个Tick
对象。TickLabel
:每个刻度上都要显示文字,这个文字的显示就是在TickLabel
上。AxisLabel
:x
轴和y
轴的名称的文字显示。Legend
:图例对象。Title
:Axes
图的标题对象。Line2D
:绘制在Axes
上的线条对象,比如折线图等。Reactangle
:绘制在Axes
上的矩形对象,比如条形图等。Marker
:标记点,比如绘制散点图上的每个点就是这个对象。Artist
:只要是绘制在Figure
上的元素(包括Figure),都是Artist
的子类。
一、Figure容器:
Figure
容器是最顶层的容器,他几乎包含了这个图的所有对象。通过add_subplot
和add_axes
方法可以添加Axes对象
,这两个方法添加的都是Axes及其子类的对象。添加完成后是存储在figure.axes
中。
1.1. 添加Axes对象:
Figure只是一个黑板,如果想要绘图,需要先添加Axes。添加Axes可以通过add_axes和add_subplot来实现。示例代码如下:
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
from matplotlib import font_manager #相关字体
fig = plt.figure()#创建figure对象
ax1 = fig.add_subplot(211)#211表示 创建的图为两(2)行一(1)列中的第一个(1),
ax2 = fig.add_axes([0.1, 0.1, 0.7, 0.3])# left,bottom,width,height 相关位置
print(ax1)
print('='*30)
print(ax2)
print('='*30)
print(fig.axes)
结果:
1.2. 操作当前Axes对象:
可以通过figure.gca以及figure.sca来设置和获取当前的axes对象。示例代码如下:
注意: 若我们直接使用plt.plot()方法实际上也是先获取当前的axes对象再进行相关操作
fig = plt.figure()
ax1 = fig.add_subplot(211)
ax2 = fig.add_axes([0,0,1,0.3])
print(fig.gca())#获取当前的axes对象,结果为ax2
print(fig.sca(ax1))#将当前的axes对象设置为ax1
结果:
Axes(0.1,0.1;0.7x0.3)
AxesSubplot(0.125,0.536818;0.775x0.343182)
1.3. 删除Axes对象:
Figure上的所有Axes对象都是保存在fig.axes中,但是如果想要删除某个Axes对象,那么必须通过delaxes来实现:
fig = plt.figure()
ax1 = fig.add_subplot(211)
ax2 = fig.add_axes([0,0,1,0.3])
fig.delaxes(ax1)
print(fig.axes)
结果:
[<matplotlib.axes._axes.Axes object at 0x0000016E9F881790>]
1.4. 获取所有的axes:
for ax in fig.axes:
ax.grid(True) # 设置打开网格,可以对相关内容进行操作
1.5. Figure的属性有如下:
Figure类定义介绍:
https://matplotlib.org/api/_as_gen/matplotlib.figure.Figure.html#matplotlib.figure.Figure
二、Axes容器:
Axes
容器是用来创建具体的图形的。比如画曲线,柱状图,都是画在上面。所以之前我们学的使用plt.xx绘制各种图形(比如条形图,直方图,散点图等)都是对Axes的封装
。比如plt.plot
对应的是axes.plot
,比如plt.hist
对应的是axes.hist
。针对图的所有操作,都可以在Axes上找到对应的API。另外后面要讲到的Axis容器,是轴的对象,也是绑定在Axes上面。
Axes的类定义介绍:https://matplotlib.org/api/axes_api.html#matplotlib.axes.Axes
2.1. 设置x和y轴的最大值和最小值:
设置完刻度后,我们还可以设置x轴和y轴的最大值和最小值。可以通过set_xlim/set_ylim来实现:
fig = plt.figure()
axes = fig.add_subplot(111)
axes.plot(np.random.randn(10))
# 设置x轴的最大值和最小值
axes.set_xlim(-2,12)
# 设置y轴的最大值和最小值
axes.set_ylim(-3,3)
结果:
2.2. 添加文本:
之前添加文本我们用的是annotate,但是如果不是需要做注释,其实还有另外一种更加简单的方式,那就是使用text方法:
data = np.random.randn(10)
fig = plt.figure()
axes = fig.add_subplot(111)
axes.plot(data)
# 添加文本,比annotate更加方便
axes.text(0,0,"hello")#在(0,0)处增加hello注释
结果:
2.3. 绘制双Y轴:
ig = plt.figure()
ax1 = fig.add_subplot(211)
ax1.bar(np.arange(0,10,2),np.random.rand(5))
ax1.set_yticks(np.arange(0,1,0.25))
ax2 = ax1.twinx() #克隆一个共享x轴的axes对象,也可以改变x轴的数值
ax2.plot(np.random.randn(10),c="b")#c='b'表示颜色为blue
plt.show()
结果:
三、Axis容器:
Axis代表的是x轴
或者y轴
的对象。包含Tick(刻度)
对象,TickLabel
刻度文本对象,以及AxisLabel坐标轴文本
对象。axis对象有一些方法可以操作刻度和文本等。
3.1. 设置x轴和y轴label的位置:
fig = plt.figure()
axes = fig.add_subplot(111)
axes.plot(np.random.randn(10))
axes.set_xlabel("x coordate")
# 设置x轴label的位置为(0.-0.1)
axes.xaxis.set_label_coords(0,-0.1)
结果:
3.2. 设置刻度上的刻度格式:
import matplotlib.ticker as ticker
fig = plt.figure()
axes = fig.add_subplot(111)
axes.plot(np.random.randn(10))
axes.set_xlabel("x coordate")
# 创建格式化对象
formatter = ticker.FormatStrFormatter('%.2f')#设置刻度格式为保留两位小数
# 设置格式化对象
axes.yaxis.set_major_formatter(formatter)
结果:
3.3. 设置轴的属性:
fig = plt.figure()
ax1 = fig.add_axes([0.1, 0.3, 0.4, 0.4])
ax1.set_facecolor('lightslategray')#axes背景
# 设置刻度上文本的属性
for label in ax1.xaxis.get_ticklabels():#遍历x轴文本
# label是一个Label对象
label.set_color('red')
label.set_rotation(45)#倾斜角度
label.set_fontsize(16)#字体大小
# 设置刻度上线条的属性
for line in ax1.yaxis.get_ticklines():#y轴线条
# line是一个Line2D对象
line.set_color('green')
line.set_markersize(25)#大小
line.set_markeredgewidth(3)#宽度
plt.show()
结果:
笔记:
-
图的构成:Figure是一个画板,上面可以有很多的axes对象,每个axes对象中有轴(Axis),有线条,有Legend,有title等。
-
Figure上的相关操作,基本的都是对Axes的一些操作。
- 添加axes:add_subplot(221)/add_axes([left,bottom,width,height])
- 当前的axes:fig.gca()获取当前的axes,fig.sca(axes)设置当前的axes。
- 删除axes:fig.delaxes(axes)
- 获取所有的axes:fig.axes保存了所有的axes对象。
-
Axes对象:大部分的图形元素都是绘制在Axes上。比如条形,折线等。
- 通过set_xlim和set_ylim可以设置x和y轴的最大值和最小值。
- 通过text可以在Axes对象上添加文本。只需要指定x和y的坐标以及文字内容就可以了。
- 添加双Y轴,原理是两个Axes对象堆叠在一起。通过ax.twinx()来克隆出一个新的axes对象。
-
Axis对象:代表的是x轴和y轴的对象。可以设置x轴的标题样式,刻度线条样式,刻度文本样式等。
-
Tick对象:一般用来控制轴的位置,比如可以控制y轴显示在右边,x轴可以显示在上面等。
-
直接操作plt.plot(),底层也是通过调用axes的相关方法,为了让用户更方便的使用做了相关封装。