day05-Matplotlib创建图形对象

一、创建图形对象

在 Matplotlib 中,面向对象编程的核心思想是创建图形对象(figure object)。通过图形对象来调用其它的方法和属性,这样有助于我们更好地处理多个画布。在这个过程中,pyplot 负责生成图形对象,并通过该对象来添加一个或多个 axes 对象(即绘图区域)。

Matplotlib 提供了matplotlib.figure图形类模块,它包含了创建图形对象的方法。通过调用 pyplot 模块中 figure() 函数来实例化 figure 对象。

创建图形对象

figure方法如下:

plt.figure(    
num=None,------------------------------------> 图像编号或名称,数字为编号。字符串为名称 
figsize=None,--------------------------------> 指定figure的宽和高,单位为英寸;    dpi=None,------------------------------------> 定绘图对象的分辨率,即每英寸多少个像素,缺省值为72    
facecolor=None,------------------------------> 背景颜色    
edgecolor=None, -----------------------------> 边框颜色    
frameon=True, -------------------------------> 是否显示边框    
**kwargs, )
from matplotlib import pyplot as plt
# 创建图形对象,相当于我们创建一个画布
fig = plt.figure()  #默认大小为800*400

# 之前通过配置更改图形的分辨率和宽高. 如今可以再创建图像对象是创建
fig = plt.figure('f1',figsize=(3,2),dpi=100)  #画布大小:300*200
# plt.plot()
x = np.arange(0,50)
y = x ** 2
plt.plot(x,y)

在这里插入图片描述

fig = plt.figure('f1',figsize=(4,2),dpi=100)
plt.plot()

在这里插入图片描述

x = np.arange(0,50)
y = x ** 2
# 创建图形对象, 图形对象的分辨率为100,背景颜色为:灰色
fig = plt.figure('f1',figsize=(4,2), dpi=100,facecolor='gray')
# 获取轴
ax = plt.gca()
ax.plot(x,y)
plt.plot(x,y)

在这里插入图片描述

二. 绘制多子图

figure是绘制对象(可理解为一个空白的画布),一个figure对象可以包含多个Axes子图,一个Axes是一个绘图区域,不加设置时,Axes为1,且每次绘图其实都是在figure上的Axes上绘图。

接下来将学习绘制子图的几种方式:

  • add_axes() : 添加区域
  • subplot() : 均等地划分画布,只是创建一个包含子图区域的画布,(返回区域对象)
  • subplots() : 既创建了一个包含子图区域的画布,又创建了一个 figure 图形对象.(返回图形对象和区域对象)

多子图可以让我们绘制出更加复杂的图形。

步骤:1、先添加区域 2、在区域上作画

fig = plt.figure(figsize=(4,2),facecolor='g')

# ax1从画布起始位置绘制,宽高和画布一致
ax1=fig.add_axes([0,0,1,1])

# ax2 从画布的左下为0 ,x轴10%,y轴60%处的位置开始绘制, 宽高是画布的 30%
ax2=fig.add_axes([0.1,0.6,0.3,0.3])

ax3=fig.add_axes([0.5,0.6,0.2,0.3])

#在不同区域作画
ax1.plot(x, y)
ax2.plot(x, y)
ax3.plot(x, y)

在这里插入图片描述

注意:每个元素的值是画布宽度和高度的分数。即将画布的宽、高作为 1 个单位。比如,[ 0.2, 0.2, 0.5, 0.5],它代表着从画布 20% 的位置开始绘制, 宽高是画布的 50%

  • 使用plt.plot(x,y)作画时,寻找最近创建的画布作画,最好使用区域.plot(),不能使用图形对象作画,fig.plot()错误

区域中基本方法的使用

  • 区域图表名称: set_title
  • 区域中x轴和y轴名称:set_xlabel() set_ylabel()
  • 刻度设置: set_xticks()
  • 区域图表图例: legend()
# 创建绘图对象
fig = plt.figure(figsize=(4,2),facecolor='g')

# 创建x坐标
x = np.arange(0,50,2)
# 创建y坐标
y = x ** 2
# 创建区域1,和画布位置一致
ax1 = fig.add_axes([0.0,0.0,1,1])
# 设置图表名称
ax1.set_title("axes1")
# x轴名称 
ax1.set_xlabel('X axis')

# 设置ax1横轴刻度
ax1.set_xticks(np.arange(0,50,3))

# 区域绘制图形
ax1.plot(x,y,label="ax1")
# 图例
ax1.legend()
# 创建区域ax2 从画布 40% 的位置开始绘制, 宽高是画布的 50%
ax2=fig.add_axes([0.2,0.2,0.4,0.4])
ax2.set_title("axes2")

# 区域2中绘制图形
ax2.plot(x,y,label='ax2')
# 图例,
ax2.legend()

在这里插入图片描述

2.subplot() 函数,它可以均等地划分画布

参数格式如下:

ax = plt.subplot(nrows, ncols, index,*args, **kwargs)
  • nrows 行
  • ncols 列
  • index: 位置
  • kwargs: title/xlabel/ylabel 等…

也可以直接将几个值写到一起,如:subplot(233)

返回:区域对象

nrows 与 ncols 表示要划分几行几列的子区域(nrows*nclos表示子图数量),index 的初始值为1,用来选定具体的某个子区域。

例如: subplot(233)表示在当前画布的右上角创建一个两行三列的绘图区域(如下图所示),同时,选择在第 3 个位置绘制子图。

在这里插入图片描述

如果新建的子图与现有的子图重叠,那么重叠部分的子图将会被自动删除,因为它们不可以共享绘图区域。

plt.plot([1,2,3])
#现在创建一个子图,它表示一个有1行2列的网格的顶部图。
#因为这个子图将与第一个重叠,所以之前创建的图将被删除
plt.subplot(211)
# x可省略,默认[0,1..,N-1]递增
plt.plot(range(50,70))

plt.subplot(212)

plt.plot(np.arange(12)**2)

在这里插入图片描述

如果不想覆盖之前的图,需要先创建画布

plt.plot([1,2,3])

# 还可以先设置画布的大小,再通过画布创建区域
fig = plt.figure(figsize=(4,2))
#创建新的画布作画
fig.add_subplot(111)

plt.plot(range(20))

fig.add_subplot(221)

plt.plot(range(12))

在这里插入图片描述

设置多图的基本信息方式:

a. 在创建的时候直接设置:
  • 对于subplot关键词赋值参数的了解,可以将光标移动到subplot方法上,使用快捷键shift+tab查看具体内容
#现在创建一个子图,它表示一个有2行1列的网格的顶部图。
plt.subplot(211,title="pic1", xlabel="x axis")
# x可省略,默认[0,1..,N-1]递增
plt.plot(range(50,70))

plt.subplot(212, title="pic2", xlabel="x axis")

plt.plot(np.arange(12)**2)

在这里插入图片描述

发现子图标题重叠,在最后使用plt.tight_layout()

plt.tight_layout()

在这里插入图片描述

b.使用pyplot模块中的方法设置后再绘制
#现在创建一个子图,它表示一个有2行1列的网格的顶部图。

#--------------- 第一个区域---------------
plt.subplot(211)
# 使用图形对象:
plt.title("ax1")   #此时的plt会自动应用到211的区域
# x可省略,默认[0,1..,N-1]递增
plt.plot(range(50,70))

#--------------------第二区域-----------
plt.subplot(212)
plt.title("ax2")   #此时的plt会自动应用到212的区域

#...其他的自己设置

plt.plot(np.arange(12)**2)
# 紧凑的布局
plt.tight_layout()

c.使用返回的区域对象设置.

注意区域对象的方法很多都是set_开头

  • 使用区域对象将不存在 设置位置
#现在创建一个子图,它表示一个有2行1列的网格的顶部图。

#--------------- 第一个区域 ax1---------------
ax1 = plt.subplot(211)
# 使用区域对象:
ax1.set_title("ax1")
# x可省略,默认[0,1..,N-1]递增
ax1.plot(range(50,70))

#--------------------第二区域 ax2-----------
ax2 = plt.subplot(212)
ax2.set_title("ax2")

#...其他的自己设置

ax2.plot(np.arange(12)**2)
# 紧凑的布局
plt.tight_layout()

在这里插入图片描述

3.subplots()函数详解

matplotlib.pyplot模块提供了一个 subplots() 函数,它的使用方法和 subplot() 函数类似。其不同之处在于,subplots() 既创建了一个包含子图区域的画布,又创建了一个 figure 图形对象,而 subplot() 只是创建一个包含子图区域的画布。

subplots 的函数格式如下:

fig , ax = plt.subplots(nrows, ncols)
  • nrows 与 ncols 表示两个整数参数,它们指定子图所占的行数、列

函数的返回值是一个元组,包括一个图形对象和所有的 axes 对象。其中 axes 对象的数量等于 nrows * ncols,且每个 axes 对象均可通过索引值访问(从1开始)

# 引入模块
import matplotlib.pyplot as plt
import numpy as np

# 创建2行2列的子图,返回图形对象(画布),所有子图的坐标轴
fig, axes =  plt.subplots(2,2)

x = np.arange(1,5)
#绘制平方函数
axes[0][0].plot(x, x*x)
axes[0][0].set_title('square')
#绘制平方根图像
axes[0][1].plot(x, np.sqrt(x))
axes[0][1].set_title('square root')
#绘制指数函数
axes[1][0].plot(x, np.exp(x))
axes[1][0].set_title('exp')

#绘制对数函数
axes[1][1].plot(x,np.log10(x))
axes[1][1].set_title('log')

# 处理标题遮挡
plt.tight_layout()

plt.show()

在这里插入图片描述

作业:绘制以下图形

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

fig,axes =  plt.subplots(1,2)
# 设置画布的高和宽, 注意:只为英寸 ,默认分别率为72
fig.set_figheight(3) # 实际高度为 73*3 像素
fig.set_figwidth(8) # 实际宽度为 73*8 像素
# 设置背景:
fig.set_facecolor('gray')
# 分别定义x y
x = np.arange(-50,51)
y = x ** 2

#--------------------绘制图形1 -----------
axes[0].plot(x, y)

# ------------处理图形2的绘制----------------
# 不需要右侧和上侧线条,则可以设置他的颜色
axes[1].spines['right'].set_color("none")
axes[1].spines['top'].set_color("none")
# 移动下轴到指定位置
# 在这里,position位置参数有三种,data , outward(向外-可自行尝试) , axes
# axes:0.0 - 1.0之间的值,整个轴上的比例
axes[1].spines['left'].set_position(('axes',0.5))

# 移动下轴到指定位置
# 'data'表示按数值挪动,其后数字代表挪动到Y轴的刻度值
axes[1].spines['bottom'].set_position(('data',0.0))

axes[1].plot(x, y)
# 绘制1行2列子图中的第1个子图
plt.subplot(121,facecolor='r')

# 绘制2行2列子图中的第2个子图
plt.subplot(222,facecolor='g')

# 绘制2行2列子图中的第4个子图
plt.subplot(224,facecolor='b')
# 绘制3行2列子图中的第1个子图
plt.subplot(321,facecolor='r')
# 绘制3行2列子图中的第2个子图
plt.subplot(322,facecolor='r')
# 绘制3行2列子图中的第3个子图
plt.subplot(323,facecolor='r')
# 绘制3行2列子图中的第4个子图
plt.subplot(324,facecolor='r')
# # 绘制3行1列子图中的第3个子图
plt.subplot(313,facecolor='b')

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值
>