一般化的子图布局

首先要创建各个子图的坐标轴,传入一个四元列表参数:[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() [[<matplotlib.axes._subplots.AxesSubplot object at 0x0000000005EF4748>
<matplotlib.axes._subplots.AxesSubplot object at 0x0000000005F23278>
<matplotlib.axes._subplots.AxesSubplot object at 0x0000000004831B38>]
[<matplotlib.axes._subplots.AxesSubplot object at 0x0000000004886320>
<matplotlib.axes._subplots.AxesSubplot object at 0x00000000048C4A90>
<matplotlib.axes._subplots.AxesSubplot object at 0x00000000049176D8>]]

从图中,我们看出,同方向上重复的坐标轴已经省去,画面简洁而清爽,同时我们可以看出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()

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

matplotlib模块之子图画法的更多相关文章

  1. Matplotlib模块:绘图和可视化

    一.简单介绍Matplotlib 1.Matplotlib是一个强大的Python绘图和数据可视化的工具包 2.安装方法:pip install matplotlib 3.引用方法:import ma ...

  2. python之 matplotlib模块之基本三图形(直线,曲线,直方图,饼图)

    matplotlib模块是python中一个强大的绘图模块 安装 pip  install matplotlib 首先我们来画一个简单的图来感受它的神奇 import numpy as np impo ...

  3. 使用Python的pandas模块、mplfinance模块、matplotlib模块绘制K线图

    目录 pandas模块.mplfinance模块和matplotlib模块介绍 pandas模块 mplfinance模块和matplotlib模块 安装mplfinance模块.pandas模块和m ...

  4. Windows python 安装 nNumpy、Scipy、matplotlib模块

    折腾了 很久,总结一些. 首先如果python 是64位,安装32位的numpy ,Scipy,或者matplotlib 模块. 会出现很多问题. 比如当你 在python 导入 Numpy 时,导入 ...

  5. python_Opencv_使用Matplotlib模块

    使用Matplotlib模块 Matplotib 是python 的一个绘图库,里头有各种各样的绘图方法. 之后会陆续了解.先学习怎样用Matplotib 显示图像. 可以放大图像,保存图像. 安装M ...

  6. python 爬虫与数据可视化--matplotlib模块应用

    一.数据分析的目的(利用大数据量数据分析,帮助人们做出战略决策) 二.什么是matplotlib? matplotlib: 最流行的Python底层绘图库,主要做数据可视化图表,名字取材于MATLAB ...

  7. 为python安装matplotlib模块

    matplotlib是python中强大的画图模块. 首先确保已经安装python,然后用pip来安装matplotlib模块. 进入到cmd窗口下,执行python -m pip install - ...

  8. Python使用matplotlib模块绘制多条折线图、散点图

    用matplotlib模块 #!usr/bin/env python #encoding:utf-8 ''' __Author__:沂水寒城 功能:折线图.散点图测试 ''' import rando ...

  9. windows_64下python下载安装Numpy、Scipy、matplotlib模块

    本文应用的python3.6.3及其对应的Numpy.Scipy.matplotlib计算模块的cp36版本,其中Numpy是需要MKL版本的Numpy,这是后续安装Scipy的需要(本机系统win7 ...

随机推荐

  1. js array filter pop push shift unshift方法

    JavaScript Array filter() 方法  JavaScript Array 对象 实例 返回数组 ages 中所有元素都大于 18 的元素: var ages = [32, 33,  ...

  2. opencv中彩色图转换成灰度图rgb2gray

    imread函数读入图像: 只需要将imread的第二个参数置为0即可. Mat imread(const string& filename, intflags=1 ); 第一个参数是载入图片 ...

  3. windows 32位以及64位的inline hook

    Tips : 这篇文章的主题是x86及x64 windows系统下的inline hook实现部分. 32位inline hook 对于系统API的hook,windows 系统为了达成hotpatc ...

  4. day9笔记--文件操作

    文件操作  计算机系统分为:计算机硬件,操作系统,应用程序三部分. 我们用python或其他语言编写的应用程序若想要把数据永久保存下来,必须要保存于硬盘中,这就涉及到应用程序要操作硬件,众所周知,应用 ...

  5. Mac下使用Homebrew 安装MySQL

    安装 brew install mysql 卸载 brew uninstall mysql 启动mysql    mysql.server start 管理员账户    mysql -uroot 

  6. awk特征相同行的合并

    [root@linux-node1 ~]# cat test.txt hisk01 hisk02 hisk03 hisk04 hisk05 hisk06 hisk07 hisk08 [root@lin ...

  7. WebApi~通过HttpClient来调用Web Api接口

    异步请求 ///<summary> /// HttpClient实现Post请求(异步) /// </summary> static async void dooPost() ...

  8. Mac Navicat_Premium_mac破解中文版

    原文地址:https://www.52pojie.cn/thread-727433-1-1.html Navicat_Premium_mac  最新版 12.0.24(原版是英文的) 汉化:安装完之后 ...

  9. 43、android:screenOrientation

    android:screenOrientationThe orientation of the activity's display on the device. The value can be a ...

  10. fiddler抓包工具使用图文教程

    一.软件简介: 一款免费且功能强大的数据包抓取软件.它通过代理的方式获取程序http通讯的数据,可以用其检测网页和服务器的交互情况,能够记录所有客户端和服务器间的http请求,支持监视.设置断点.甚至 ...