Python之Matplotlib(四)

Python之Matplotlib(四)

一、多图合并显示

1.plt.subplot()多合一显示

(1)均匀图中图
  • 首先使用import导入matplotlib.pyplot模块, 并简写成plt
  • 使用plt.figure创建一个图像窗口.使用plt.subplot来创建小图。plt.subplot(2,2,1)表示将整个图像窗口分为2行2列, 当前位置为1.
  • 使用plt.plot([0,1],[0,1])在第1个位置创建一个小图。
  • plt.subplot(224)表示将整个图像窗口分为2行2列, 当前位置为4。使用plt.plot([0,1],[0,4])在第4个位置创建一个小图。
import matplotlib.pyplot as plt
plt.figure()
# 共两行两列,第一幅图
plt.subplot(2,2,1)
#x,y的分别取(0,1)
plt.plot([0,1],[0,1])

plt.subplot(2,2,2)
plt.plot([0,1],[0,2])

plt.subplot(223)
plt.plot([0,1],[0,3])

plt.subplot(224)
plt.plot([0,1],[0,4])
plt.show()

运行结果
在这里插入图片描述

(2)不均匀图中图

如果希望展示的小图的大小不相同, 应该怎么做呢?
以上面的4个小图为例, 如果把第1个小图放到第一行, 而剩下的3个小图都放到第二行。使用plt.subplot(2,1,1)将整个图像窗口分为2行1列, 当前位置为1。使用plt.plot([0,1],[0,1])在第1个位置创建一个小图。使用plt.subplot(2,3,4)将整个图像窗口分为2行3列, 当前位置为4。使用plt.plot([0,1],[0,2])在第4个位置创建一个小图。

这里需要解释一下为什么第4个位置放第2个小图。上一步中使用plt.subplot(2,1,1)将整个图像窗口分为2行1列, 第1个小图占用了第1个位置, 也就是整个第1行。这一步中使用plt.subplot(2,3,4)将整个图像窗口分为2行3列, 于是整个图像窗口的第1行就变成了3列, 也就是成了3个位置, 于是第2行的第1个位置是整个图像窗口的第4个位置。

# 不均匀图中图
plt.subplot(2,1,1)
plt.plot([0,10],[0,5])

plt.subplot(2,3,4)
plt.plot([0,1],[0,1])

plt.subplot(2,3,5)
plt.plot([0,1],[0,3])

plt.subplot(2,3,6)
plt.plot([0,1],[0,5])
plt.show()

运行结果
在这里插入图片描述
matplotlib 的 subplot 还可以是分格的,下面介绍三种方法同样也能达到 subplot() 函数的效果:subplot2grid、gridspec 和 subplots 。他们相比起普通的 subplot 会更加方便,在判断图的编号时不需要进行很复杂的考虑。

2.plt.subplot2grid()

  • 使用plt.subplot2grid来创建第1个小图,
  •  (3,3)表示将整个图像窗口分成3行3列
    
  •  (0,0)表示从第0行第0列开始作图,colspan=3表示列的跨度为3, rowspan=1表示行的跨度为1。
    
  •  colspan和rowspan缺省, 表示默认跨度为1。
    
import matplotlib.pyplot as plt
ax1=plt.subplot2grid((3,3),(0,0),colspan=3)
ax1.plot([1,2],[1,2])#画小图
ax1.set_title('pic_1')#设置小图的标题
plt.show()

运行结果
在这里插入图片描述

  • 使用plt.subplot2grid来创建第2个小图
  •  (3,3)表示将整个图像窗口分成3行3列
    
  •   (1,0)表示从第1行第0列开始作图,colspan=2表示列的跨度为2. 
    

细心的小伙伴可能可以注意到,在第一章我们设置标题与坐标轴时,使用的是plt.title()这样的语句,针对小图 ax ,我们的设置前都要加上 ‘set’。

import matplotlib.pyplot as plt
# 将整个图像分成3行3列,从第0行第0列开始,列跨度为3
ax1=plt.subplot2grid((3,3),(0,0),colspan=3)
ax1.plot([1,2],[1,2])#画小图
ax1.set_title('pic_1')#设置小图的标题
# 将整个图像分成3行3列,从第1行第0列开始,列跨度为2
ax2=plt.subplot2grid((3,3),(1,0),colspan=2)
# 将整个图像分成3行3列,从第1行第2列开始,行跨度为2
ax3=plt.subplot2grid((3,3),(1,2),rowspan=2)
# 将整个图像分成3行3列,从第2行第0列开始,行、列跨度分别为1
ax4=plt.subplot2grid((3,3),(2,0))
# 将整个图像分成3行3列,从第2行第1列开始,行、列跨度分别为1
ax5=plt.subplot2grid((3,3),(2,1))
# 绘制散点图x,y的范围分别是(1,2)(2,2)
ax4.scatter([1,2],[2,2])
# 给图4的xy轴命名
ax4.set_xlabel('ax4_x')
ax4.set_ylabel('ax4_y')
plt.show()

运行结果
在这里插入图片描述

3.gridspec.GridSpec()

gridspec 同样能帮助我们画出上文的图,个人觉得 gridspec 的使用是最为方便的,因为它允许我们使用索引的方式指定小图的大小和位置。
首先,利用import导入matplotlib.pyplot模块, 并简写成plt. 利用import导入matplotlib.gridspec, 并简写成gridspec

import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
plt.figure(figsize=(8,8))
# 将整个图像窗口分为3行3列
gs=gridspec.GridSpec(3,3)
# 表示这个图占第0行和所有列
ax1=plt.subplot(gs[0,:])
# 表示这个图占第1行和第2列前的所有列
ax2 = plt.subplot(gs[1, :2])
# 表示这个图占第1行后的所有行和第2列
ax3 = plt.subplot(gs[1:, 2])
# 表示这个图占倒数第1行和第0列
ax4 = plt.subplot(gs[-1, 0])
# 表示这个图占道术第一行和倒数第二列
ax5 = plt.subplot(gs[-1, -2])
plt.show()

4.plt.subplots()

subplots 不同于 subplot, 它允许我们将图像窗口集合在一起表示。

import matplotlib.pyplot as plt
f,((ax1,ax2),(ax3,ax4))=plt.subplots(2,2,sharex=True,sharey=True)
ax1.scatter([1,2],[1,2])
# 紧凑显示图像
plt.tight_layout()
plt.show()

运行结果
在这里插入图片描述

5.图中图(plot in plot):fig.add_axes()

(1)生成数据
(2)绘制大图
(3)绘制小图
import matplotlib.pyplot as plt
x=[1,2,3,4,5,6,7]
y=[1,3,4,2,5,8,6]
# 确定大图左下角的位置以及宽高
left, bottom, width, height = 0.1, 0.1, 0.8, 0.8
# 绘制大图
fig=plt.figure()
ax1=fig.add_axes([left,bottom,width,height])
ax1.plot(x,y,'r')
ax1.set_xlabel('x')
ax1.set_ylabel('y')
ax1.set_title('pic_1')

# 确定小图的左下角的位置以及宽高
left, bottom, width, height = 0.2, 0.6, 0.25, 0.25
ax2=fig.add_axes([left,bottom,width,height])
ax2.plot(y,x,'b')
ax2.set_xlabel('x')
ax2.set_ylabel('y')
ax2.set_title('inside 1')

# 绘制右下角的小图
plt.axes([0.6,0.2,0.25,0.25])
plt.plot(y[::-1],x,'g')
plt.xlabel('x')
plt.ylabel('y')
plt.title('inside 2')

plt.show()

运行结果
在这里插入图片描述

6.次坐标轴:ax.teinx()

有时候我们会用到次坐标轴,即在同个图上有第2个y轴存在。这件事同样可以用matplotlib做到,而且很简单。

(1)生成数据
import matplotlib.pyplot as plt
import numpy as np
# 生成数据
x=np.arange(0,10,0.1)
y1=0.05*x**2
y2=-1*y1
(2)设置两个坐标系并画图

可以看到,y2和y1是互相倒置的。所以,我们先获取figure默认的坐标系 ax1;然后对ax1调用twinx()方法,生成如同镜面效果后的ax2;最后接着进行绘图, 将 y1, y2 分别画在 ax1, ax2 上:

fig,ax1=plt.subplots()
ax2=ax1.twinx()
ax1.plot(x,y1,'g-')#线的颜色:green,线型:solid line
ax1.set_xlabel('x data')
ax1.set_ylabel('y1 data',color='g')
ax2.plot(x,y2,'b-')#线的颜色:blue,线型:solid line
ax2.set_ylabel('y2 data',color='b')
plt.show()

运行结果
在这里插入图片描述
自学自用,希望可以和大家积极沟通交流,小伙伴们加油鸭,如有错误还请指正,不喜勿喷

  • 6
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

柚子味的羊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值