目录
Matplotlib 是 python 中一款强大的可视化绘图工具,可以以更直观的方式对数据进行展示和呈现,可以准确高效传递信息,甚至可以帮助我们发现某种规律和特征,挖掘数据背后的价值,本文简单介绍了Matplotlib常用操作和方法
一、操作
(一)创建图形对象
Matplotlib 中,面向对象编程的核心思想是创建图形对象并对其进行操作,或调用方法与属性,这样我们在处理多个画布和图形将更加有效
使用 plt.figure() 生成图形对象,并设置当前画布特征,返回值是一个 figure 对象
f=plt.figure()
内部参数:
- num:图形编号或名称,数字:编号、字符串:名称
- figsize:指定宽高,单位为英寸
- dpi:分辨率,默认72
- facecolor:背景颜色
- edgecolor:边框颜色
- frameon:是否显示边框
(二)多子图操作
上面生成的一个 figure 对象可以包含多个 axes 子绘图区域,一个 axes 是一个绘图区域,不加设置时 Axes 默认为1,整个画布都是绘图区域,理解为一个画框铺上一张纸作画
在多子图出现重叠情况时尝试使用 plt.tight_layout() 方法设置紧凑型布局
创建子绘图区域三种方法:
1.add_axes(rect):添加区域
matplotlib 库中定义了一个 axes 类(轴域),指定了一个有数值范围的绘图区域,给定一个画布中可以包含多个 axes 对象,同一个 axes 只能在一个画布中使用
- rect:位置参数,形如[left,bottom,width,height],表示左下角在画布中的位置、相对于画布的宽、高,通过比例表示(0-1)
f=plt.figure()
ax2=f.add_axes([0,0,1,1])
ax1=f.add_axes([0.2,0.2,0.5,0.5])
# 添加时会有顺序,先添加的会被覆盖在底下
ax1.plot([1,2,3],[4,5,6])
ax2.plot([6,5,4],[3,2,1])
plt.show()
关键:关于plot()
figure() 会默认创建一个作图区域,可使用 ax.plot() 对想要操作的 axes 对象进行绘图,plt.plot() 方法默认对当前 axes 进行绘制(新创一个 axes,就会切换到最新的 axes),如下面默认当前所在的区域是 ax1,因为 ax1 是最新创建的
plot(y):仅有一个值时省略了x,则x默认[0,N-1]均匀递增,N为y轴元素个数
f=plt.figure()
ax2=f.add_axes([.1,.1,.8,.8])
ax1=f.add_axes([0.2,0.2,0.5,0.5])
plt.plot([1,2,3],[4,5,6])
plt.plot([6,5,4],[3,2,1])
plt.show()
2.subplot():划分画布
返回的值是当前区域对象
ax1=plt.subplot(211)
参数:
- nrows:行
- ncols:列
- index:当前所在定位
- 其他:title、xlable、ylable 等均可设置
也可使用 fig.add_subplot() 方法在画布上进行绘制,3.6版本后新建子图若与现有子图重叠时,重叠部分子图会被自动删除
3.subplots
使用方法和 subplot() 是类似
fig,ax=plt.subplots(4)
如何取?
由索引为0开始的行和列进行定位
fig,ax=plt.subplots(2,2)
plt.tight_layout()
# 选一个区域绘制
ax1=ax[0][1]
x=np.arange(5)
ax1.plot(x,x*2)
ax1.set_title('sqrt')
# 换一个区域绘制
ax2=ax[1][0]
ax2.plot(x,np.exp(x))
ax2.set_title('ex')
plt.show()
区别:
- subplot() 仅返回一包含子区域的画布,而 subplots() 返回元组,返回区域的基础上还会返回一个 figure 图形对象
- subplots() 将画布均匀划分,若要画实现更加自由的页面布局,可多次调用 subplot()
4.设置多图基本信息的几个方法
主要是直接创建、pyplot方式以及面向对象三种方式
(1)创建时直接设置
如
plt.subplot(211,title='',xlable='x_axis')
(2) 使用 pyplot 模块中方法设置之后绘图
如
-----区域1-----
plt.subplot(211)
plt.title('ax1')
plt.plot(..)
-----区域2-----
plt.subplot(212)
plt.title('ax2')
plt.plot(..)
(3)对返回的区域对象设置
对于区域对象很多方法都是 set_ 开头
ax1=plt.subplot(211)
ax2=plt.subplot(212)
-----区域1-----
ax1.set_title('ax1')
ax1.plot(..)
-----区域2-----
ax2.set_title('ax2')
ax2.plot(..)
(三)显示图片
plt.show(),在 jupyter 里不需要,会自动显示图像
x=np.arange(-50,50)
y=x**2
plt.title('标题')
plt.plot(x,y)
plt.show()
- linewidrth:该参数可以设置线条宽度
二、相关元素设置
所有设置应在绘图前进行设置,matplotlib 会定位对当前图片或当前画布进行操作
(一)图表名称
使用 title() 方法
plt.title('标题名称',fongsize=12)
- fontsize:可以设置标题字体大小
(二)x、y 轴名称
使用xlable、ylable
plt.xlabel('x轴',fongsize=12)
plt.ylabel('y轴')
字体参数
- fontsize:设置字体大小
(三)x、y 轴刻度
使用 xticks()、yticks(),可以将 x、y 轴设置为想要的样子
参数
- ticks:ticks的位置列表,为空则删除所有 ticks(如使用 range 指定隔几个显示一个 ticks)
- lable:给定刻度线的标签,不指定将显示原来的标签,必须在 ticks 参数生效时才可使用
- roration:旋转角度
- color:颜色
x_ticks=range(-50,51,10)
y_ticks=range(0,2500,100)
plt.xticks(x_ticks)
plt.yticks(y_ticks)
(四)图例
legend(),用于放在图中一角对于符号颜色代表内容的指示和说明,若图形本身有 lable 将默认使用lable的值作为图例说明
plt.plot(x,y,lable='a')
plt.legend() # 显示图例
图例中 x、y 构成的线默认为 a
设置 plt.legend(loc='xxx') 参数可以对位置进行设置,图例本身默认寻找最佳位置放置(即不阻挡视图的地方)
(五)每条 x、y 的具体数值
使用 plt.text() 显示对应点上的数据值,由于x和y是对应坐标,一次只能指定一个,所以没法一步到位,应用循环语句一个个标注
参数:
- x、y:坐标值(必有)
- string:要说明文字(必有)
- fontsize:字体大小
- verticalalignment:垂直对齐方式(可选:'center'/'top'/'bottom'/'baseline')
- horizontalalignment:数值对齐方式(可选:'center'/'right'/'left')
补充:
说明 zip() 方法:生成一个迭代器对象
x_l=[1,2,3]
y_l=[4,5,6]
a=zip(x_l,y_l)
print(a,type(a),id(a))
for x,y in a:
print(x,y)
<zip object at 0x000001CEBF714880> <class 'zip'> 1987486763136
1 4
2 5
3 6
标注 x、y 的代码如下
# 根据x标签算出每个y对应的值
y_l=[]
for i in range(len(x_ticks)):
y_l.append(x_ticks[i]**2)
# 生成迭代器
z=zip(x_ticks,y_l)
# 遍历
for a,b in z:
plt.text(a,b,b)
# 画图
plt.show()
(六)显示中文及负号
上面的图片并没有将中文显示出来,因为 matplotlib 默认不支持中文,应修改字体配置,matplotlib 默认配置信息可以通过运行配置参数 rcParms 修改
设置完中文后,默认使用 Unicode 负号,同样需要设置
plt.rcParams['font.sans-serif']=['SimHei'] --显示中文
plt.rcParams['axes.unicode_minus']=False --显示负号
三、可视性设置
(一)网格线
使用 plt.grid() 方法
参数:
- True:显示网格
- linestyle:线形,默认实线
- color:颜色默认灰色
- linewidth:宽度
- axis:x,y,both,显示x、y、两者的网格
plt.grid(True,linestyle='--',color='gray',axis='y')
plt.show()
(二)对坐标轴操作
plt.gca() 可以定位要控制坐标轴的轴线,如果有多个图片可以先定位到对应要操作的图片,再使用该方法,我们当前只有一个图片,因此对应的就是图片的四条轴线
spines 指的就是轴,使用 set 对其修改
ax=plt.gca()
ax.spines['right'].set_color('none') # 设为透明
ax.spines['top'].set_color('none')
ax.spines['left'].set_position(('data',0))
# 位置设置的方法:
# ① data:元组,后面的数字代表挪动到的刻度值
# ② outward
# ③ axes:在整个轴上的比例取值0到1之间
(三)rcParams
需要特别眼熟,这个方法可以对图像很多默认配置进行设置,如字体的修改、图画分辨率、尺寸大小等等
plt.rcParams['figure.figsize']=(8,4) # 单位:英寸,默认6*4inch
plt.rcParams['figure.dpi']=300
(四)关于图表参数
plt.plot(x,y,color=xx,alpha=xx,linestyle=xx,linewidth=xx,maker=xx,makeredgecolor=xx,makersize=xx,makeredgewidth=xx)
- color:颜色,可以使用英文全称,或16进制(要用直接查,要用#号)
- alpha:透明度(取值0-1)越大透明底越低
- linestyle、linewidth:线条样式、宽度
- maker、makeredgecolor、makersize、makeredgewidth:标记点设置、颜色、大小、宽度
常见:
样式缩写
由于各种符号标记不会重复,因此可以直接使用形如以下方式的缩写
plt.plot(x,y,'r-+')
绘图注意事项:
- x与y个数应当一致否则会报错
- 在设定 x 与 y 的 ticks 时,lables 应用数字元素本身而非索引设置,若数据类型为字符串类型,则使用索引设置,要对应上