matplotlib模块之子图画法
一般化的子图布局
首先要创建各个子图的坐标轴,传入一个四元列表参数:[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模块之子图画法的更多相关文章
- Matplotlib模块:绘图和可视化
一.简单介绍Matplotlib 1.Matplotlib是一个强大的Python绘图和数据可视化的工具包 2.安装方法:pip install matplotlib 3.引用方法:import ma ...
- python之 matplotlib模块之基本三图形(直线,曲线,直方图,饼图)
matplotlib模块是python中一个强大的绘图模块 安装 pip install matplotlib 首先我们来画一个简单的图来感受它的神奇 import numpy as np impo ...
- 使用Python的pandas模块、mplfinance模块、matplotlib模块绘制K线图
目录 pandas模块.mplfinance模块和matplotlib模块介绍 pandas模块 mplfinance模块和matplotlib模块 安装mplfinance模块.pandas模块和m ...
- Windows python 安装 nNumpy、Scipy、matplotlib模块
折腾了 很久,总结一些. 首先如果python 是64位,安装32位的numpy ,Scipy,或者matplotlib 模块. 会出现很多问题. 比如当你 在python 导入 Numpy 时,导入 ...
- python_Opencv_使用Matplotlib模块
使用Matplotlib模块 Matplotib 是python 的一个绘图库,里头有各种各样的绘图方法. 之后会陆续了解.先学习怎样用Matplotib 显示图像. 可以放大图像,保存图像. 安装M ...
- python 爬虫与数据可视化--matplotlib模块应用
一.数据分析的目的(利用大数据量数据分析,帮助人们做出战略决策) 二.什么是matplotlib? matplotlib: 最流行的Python底层绘图库,主要做数据可视化图表,名字取材于MATLAB ...
- 为python安装matplotlib模块
matplotlib是python中强大的画图模块. 首先确保已经安装python,然后用pip来安装matplotlib模块. 进入到cmd窗口下,执行python -m pip install - ...
- Python使用matplotlib模块绘制多条折线图、散点图
用matplotlib模块 #!usr/bin/env python #encoding:utf-8 ''' __Author__:沂水寒城 功能:折线图.散点图测试 ''' import rando ...
- windows_64下python下载安装Numpy、Scipy、matplotlib模块
本文应用的python3.6.3及其对应的Numpy.Scipy.matplotlib计算模块的cp36版本,其中Numpy是需要MKL版本的Numpy,这是后续安装Scipy的需要(本机系统win7 ...
随机推荐
- 如何居中div?
如何居中div? 水平居中 1 //给div设置一个宽度,然后添加margin:0 auto属性 2 3 div{ 4 width:200px; 5 margin:0 auto; 6 } 让绝对定位的 ...
- 我们可以用JAX-WS轻松实现JAVA平台与其他编程环境(.net等)的互操作
在 JAX-WS中,一个远程调用可以转换为一个基于XML的协议例如SOAP,在使用JAX-WS过程中,开发者不需要编写任何生成和处理SOAP消息的代码.JAX-WS的运行时实现会将这些API的调用转换 ...
- selenium + js 处理窗口
1.隐藏页面的广告窗口 document.getElementById("top_left").style.display="none"; 2.隐藏控件点击 d ...
- weex - 创建项目
初始化 请确保你已经安装了 Node.js,然后全局安装 weex-toolkit. npm install weex-toolkit -g 这条命令会向你命令行环境中注册一个 weex 命令.你可以 ...
- mysql with python
前言: 数据库为人类解决了三大问题:持久化存储.优化读写.数据标准化. MySQL它不是数据库,它是管理数据库的软件.MySQL管理了很多数据库.是典型的服务型数据库,需要TCP/IP去连接. MyS ...
- 常见cout格式输出
cout.setf(ios::fixed);//设置格式 cout.unsetf(ios::fixed);//取消格式 cout.setf(ios::scientific);//科学记数法 cout. ...
- html5 上传头像示例及其注意事项
转自[B5教程网]:http://www.bcty365.com/content-142-5244-1.html 这次分享一个简易的上传头像示例,其大致流程为: 一.将选择的图片转为base64字符串 ...
- 修改已生成项目app名称
在搜索里添加product Name,然后修改成你需要的app名称 修改完后可能会报错误如下 原因是test的测试路径发生了变化,其实如果不修改Test host的路径保留原来的重命名之前的app也是 ...
- Bean\Entity\Model\POJO\Dto\EJB简单解析
一.Bean 对于Bean而言,只要是Java的类的就可以称为一个Bean, 更用在Spring上,被Spring管理的对象就可以将其称作为Bean. 它不仅仅可以包括对象的属性以及get,set方法 ...
- JavaWeb 之文件上传
1. 文件上传的要求 1.1 上传对表单的限制 method="post"; enctype="multipart/form-data"; 表单中需要添加文件表 ...