利用这个机会,希望把子图内容一步到位,搞懂搞透。

有时候我们需要从多个角度进行数据的比较、分析,因此就需要用到子图。子图的本质是在一个较大的图形中同时放置一组较小的坐标轴,布局形式可以多种多样,不拘泥于我们在第五集中举的那种网格图的形式。

我们先进行一般化的子图布局。

首先要创建各个子图的坐标轴,传入一个四元列表参数:[x,y,width,height],用来表示这个子图坐标轴原点的x坐标、y坐标,以及宽和高。值得注意的是,这四个值的取值范围都是[0,1],我们约定整个大图的左下端为原点(0,0),右上端为(1,1)。那么x,y的取值就表示该子图坐标原点的横坐标值和纵坐标值占大图整个长宽的比例。而width和height则表示子图的宽和高占整个大图的宽和高的比例。如果不传入参数则表示选取默认坐标轴,即大图的坐标轴。

import numpy as np

import matplotlib.pyplot as plt

ax1 = plt.axes()

ax2 = plt.axes([0.5, 0.6, 0.15, 0.25])

plt.show()

下一步,我们就要在子图中进行绘图了,每生成一个子图坐标系,plt就表示当前的子图,调用plt.plot就是在当前的子图上进行绘图。

import numpy as np

import matplotlib.pyplot as plt

x = np.linspace(0, 10)

plt.axes([0.1, 0.5, 0.8, 0.4], ylim=(-1.2, 1.2))

plt.grid(True)

plt.plot(np.sin(x))

plt.axes([0.1, 0.1, 0.8, 0.4], ylim=(-1.2, 1.2))

plt.grid(True)

plt.plot(np.cos(x))

plt.show()

这时候,我们很自然的回忆起我们在第五集中所使用的plt.subplot方法,和上面有所不同的是,subplot方法无法绘制比例自定义的子图,而是只能创建彼此对齐的行列网格子图,如果仅仅是这种需求的话,倒是使用起来非常简便:

import numpy as np

import matplotlib.pyplot as plt

plt.subplots_adjust(hspace=0.3, wspace=0.3)

for i in range(1,7):

plt.subplot(2,3,i)

plt.text(0.5,0.5,str((2,3,i)),fontsize=18,ha='center')

plt.show()

这个用法非常简单和直观,着重说一下plt.subplots_adjust这个方法,他设置了子图之间的纵、横两方向上的间隙,然后子图中的文本就是他的编号规则。

但是有没有一种感觉,就是这里面的子图显得非常拥挤,因为每个子图都有自己的一套独立的坐标轴,如果这些子图的坐标轴的取值都是一样的,那我们能否让他们同方向上公用,用以简化图形的描述呢,当然可以。

我们下面介绍子图间坐标轴的共用。

import numpy as np

import matplotlib.pyplot as plt

fig, ax = plt.subplots(2,3,sharex='col',sharey='row')

print(ax)

plt.show()

[[

]

[

]]

从图中,我们看出,同方向上重复的坐标轴已经省去,画面简洁而清爽,同时我们可以看出plt.subplots的返回值是一个二维数组,内含子图的坐标轴,我们可以进行引用,利用坐标轴对象也可以在当前子图上进行同样的绘图操作。

import numpy as np

import matplotlib.pyplot as plt

fig, ax = plt.subplots(2,3,sharex='col',sharey='row')

for i in range(2):

for j in range(3):

ax[i,j].text(0.5,0.5,str((i,j)),fontsize=18,ha='center')

plt.show()

如果我们想实现一种不规则的多行多列子图,该怎么办?

这是就要利用GridSpec方法了。

import numpy as np

import matplotlib.pyplot as plt

grid = plt.GridSpec(2, 3, wspace=0.5, hspace=0.5)

plt.subplot(grid[0,0])

plt.subplot(grid[0,1:3])

plt.subplot(grid[1,0:2])

plt.subplot(grid[1,2])

plt.show()

我们来简单的介绍一下这个图的画法,我们得到一个长×宽为2×3的grid区域,这个grid的原点是左上角,第一行第一列的子图占据grid的第0个长度,第0个宽度;第一行第二列子图占据grid的第0个长度,第1和第2个宽度(因此用分片1:3来表示),其他的以此类推。这样我们就能画出我们自定义位置和大小的子图(不过注意,其长和宽都是grid单位的整数倍)

最后,基于这种画法,我们举一个实际的例子。我们考虑在一个子图中画出二元正态分布的联合分布图,而在另两个子图中分别画出x轴和y轴方向上的边缘分布图。

import numpy as np

import matplotlib.pyplot as plt

mean = [0, 0]

cov = [[1, 1], [1, 4]]

x, y = np.random.multivariate_normal(mean, cov, 3000).T

plt.figure(figsize=(6,6))

grid = plt.GridSpec(4, 4, wspace=0.5, hspace=0.5)

main_ax = plt.subplot(grid[0:3,1:4])

plt.plot(x,y,'ok',markersize=3,alpha=0.2)

y_hist = plt.subplot(grid[0:3,0],xticklabels=[],sharey=main_ax)#和大子图共y轴

plt.hist(y,60,orientation='horizontal',color='gray')#图形水平绘制

y_hist.invert_xaxis()#x轴调换方向

x_hist = plt.subplot(grid[3,1:4],yticklabels=[],sharex=main_ax)#和大子图共x轴

plt.hist(x,60,orientation='vertical', color='gray')#图形垂直绘制

x_hist.invert_yaxis()#y轴调换方向

plt.show()

在最大的子图中,我们通过散点图,绘制了联合分布情况,而两个小的子图,通过频次直方图绘制了边缘分布。这种图在统计分析上非常有用。

更系统、更深入的探讨欢迎进入我们的专栏《Python数据科学之路》:酱油哥:来吧,一起踏上Python数据科学之路​zhuanlan.zhihu.com

本专栏仿照美剧的剧集编排方式和整体逻辑架构进行组织,目前策划共分为七季:

第一季:Python编程语言核心基础。

第二季:Python数据分析基本工具。

第三季:机器学习线性代数核心-Python描述。

第四季:利用python进行时间序列分析。

第五季:机器学习概率统计核心-Python描述。

第六季:机器学习典型算法专题。

第七季:实战热点深度应用。

让我们一步一个台阶,共同踏上Python数据科学之旅。

python设置子图的坐标_python如何调整子图的大小?相关推荐

  1. python设置二维列表_Python设置为列表

    python设置二维列表 Python设置为列表 (Python Set to List) Sometimes we have to create a list from the set object ...

  2. python设置默认utf8编码_Python设置默认编码为utf8的方法

    本文实例讲述了python设置默认编码为utf8的方法.分享给大家供大家参考,具体如下: 这是Python的编码问题,设置python的默认编码为utf8 python安装目录:/etc/python ...

  3. python设置单元格宽度_python – 在Excel中调整单元格宽度

    我正在使用xlsxwriter写入Excel工作表.我面临的问题是:当文本超过单元格大小时,它会被隐藏. import xlsxwriter workbook = xlsxwriter.Workboo ...

  4. python怎么编程输入坐标_python编程之API入门: (一)使用百度地图API查地理坐标...

    在网络编程中,我们会和API打交道.那么,什么是API?如何使用API呢?本文分享了一下我对API的理解以及百度地图API的使用. API是"Application Programming ...

  5. python设置背景图片大全_Python实例讲解 - tkinter canvas (设置背景图片及文字)

    Python实例讲解 -- tkinter canvas (设置背景图片及文字) 先来一个绘图: from Tkinter import * master = Tk() w = Canvas(mast ...

  6. python设置横坐标的值_python中画图如何修改横坐标大小?

    原标题:python中画图如何修改横坐标大小? 用matplotlib画二维图像时,默认情况下的横坐标和纵坐标显示的值有时达不到自己的需求,需要借助xticks()和yticks()分别对横坐标x-a ...

  7. python自动标注autocad坐标_python 可视化 二维坐标标注等等

    基本画图操作: import matplotlib.pyplot as plt import numpy as np x = np.linspace(-3,3,50) y1 = 2*x+1 y2 = ...

  8. python自动标注autocad坐标_Python+matplotlib数据可视化鼠标悬停自动标注功能实现

    功能描述:根据已有数据绘制图形之后,鼠标进入轴内自动设置背景色,退出轴时自动恢复背景色,若鼠标移动时悬停于曲线附近,则自动弹出文本标注提示当前值. 参考代码: 运行效果(鼠标位于轴外时): 运行效果( ...

  9. python设置mysql外键_python基础教程之MySQL数据库之-foreign key 外键(一

    今日重点:外键 一对多 多对多 一对一 -------------------------------------------------------------------------------- ...

最新文章

  1. UVA11059 Maximum Product
  2. 小米纵向拓展接力赛 接棒新国货“热水器”
  3. Xcode7 (Xcode setting ENABLE_BITCODE)
  4. 【已解决】如何干干净净的卸载MySQL数据库
  5. code3289 花匠
  6. [探索 .NET 6]02 比较 WebApplicationBuilder 和 Host
  7. jquery中attr和prop的区别分析
  8. java 多个队列处理_加入多处理队列需要很长时间
  9. 人工智能综述性论文_人工智能论文研读:深度学习算法与架构综述(包含详细统计表)...
  10. URL Scheme获取帮助文档
  11. Microsoft Excel设置单元格下拉框的方法
  12. mars3d的config.json 配置文件说明
  13. note4x rom android p,红米Note4x安卓8.0刷机包
  14. 实现键盘enter回车键调用登陆函数
  15. java web开发实训心得,【JavaWeb实训心得体会材料】
  16. 高数考研归纳 - 微分学 - 一元微分学
  17. codeforces 348A Mafia
  18. 什么硬件可以手游服务器,台湾服务器用来挂机手游要哪些硬件支持?
  19. d3js(D3JS 不规则图形)
  20. LabVIEW2021中文版安装包、工具包、安装教程下载

热门文章

  1. 基于仿360小说网站(校园网)的源码设计实现(升级版)
  2. 柯桥韩国人到底一周平均要吃几次泡面?
  3. 人工智能发展历史与趋势
  4. SAP 打印配置(SPAD)解析
  5. Cesium中自定义材质material
  6. wsl2下安装lammps
  7. 春季高考计算机专业知识归纳,春季高考计算机试题总结.doc
  8. 爬取微博热点评论用户ID--简易版本
  9. Laravel 5.8 前瞻 1
  10. error LNK1207:-XXX.pdb”中的 PDB 格式不兼容;请删除并重新生成