一、绘制固定区域的子图

matplotlib可以将整个画布规划成等分布的m*n(行 x 列)的矩阵区域,并对每个区域进行编号。

1.1、绘制单子图
使用pyplot()函数的subplot()可以在规划好的某个区域中绘制单个子图。
语法格式如下:

subplot(nrowos,ncols,index,projection,polar,sharex,sharey,label,**kwargs)

该函数的常用参数含义如下:

  • nrows:表示规划区域的行数
  • ncols:表示规划区域的列数
  • index:表示选择区域的索引,默认从1开始编号
  • projection:表示子图的投影类型,可以为None、‘aitoff’、‘hanmmer’、‘lambert’、‘mollweide’,‘prolar’、‘rectiliinear’中任取一值。
  • polar:表示是否使用极坐标,默认值为False
  • sharex,sharey:表示是否共享子图的x轴或y轴

subplot()函数会返回一个Axes类的子类SubplotBase对象

需要说明的是,Figure类对象可以使用add_subplot()方法绘制单子图,此方法与subplot()函数的作用是等价的

例如,将画布规划成32的矩阵区域,并在索引为6的区域中绘制子图。再将画布规划成31的矩阵区域
代码如下:

import matplotlib.pyplot as plt
ax_one=plt.subplot(326)
ax_one.plot([1,2,3,4,5])
ax_two=plt.subplot(312)
ax_two.plot([1,2,3,4,5])
plt.title("39")
plt.show()

运行结果如下:

Jupyter Notebook的绘图模式
当Jupyter Notebook工具运行程序时,默认会以静态图片的形式显示运行结果。此时的图片不支持放大或缩小等交互操作。
Jupyter Notebook支持两种绘制模式。
1、控制台绘图
2、弹出窗绘制

1.2、实例:

import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei']
x=[x for x in range(1,13)]
y1=[20,28,23,16,29,36,39,33,31,19,21,25]
y2=[17,22,39,26,35,23,25,27,29,38,28,20]
labels=['1月','2月','3月','4月','5月','6月','7月','8月','9月','10月','11月','12月']
ax1=plt.subplot(211)
ax1.plot(x,y1,'m--o',lw=2,ms=5,label='产品A')
ax1.plot(x,y2,'g--o',lw=2,ms=5,label='产品B')
ax1.set_title("产品A与产品B的销售额趋势 39",fontsize=11)
ax1.set_ylim(10,45)
ax1.set_ylabel('销售额(亿元)')
ax1.set_xlabel('月份')
for xy1 in zip(x,y1):ax1.annotate("%s"% xy1[1],xy=xy1,xytext=(-5,5),textcoords='offset points')
for xy2 in zip(x,y2):ax1.annotate("%s"% xy2[1],xy=xy2,xytext=(-5,5),textcoords='offset points')
ax1.legend()
ax2=plt.subplot(223)
ax2.pie(y1,radius=1,wedgeprops={'width':0.5},labels=labels,autopct='%3.lf%%',pctdistance=0.75)
ax2.set_title('产品A的销售额 39')
ax3=plt.subplot(224)
ax3.pie(y2,radius=1,wedgeprops={'width':0.5},labels=labels,autopct='%3.lf%%',pctdistance=0.75)
ax3.set_title('产品B的销售额 39')
plt.tight_layout()
plt.show()

运行结果:
整个窗口同时显示了3个图表

1.3、绘制多子图
使用pyplot的subplots()函数可以在规划好的所有区域中一次绘制多个子图。
语法格式如下:

subplots(nrowos=1,ncols=1,sharex=False,sharey=False,squeeze=True,subplot_kw=None,
gridspec_kw=None,**fig_kw

常用的参数的含义如下:

  • nrows:表示规划区域的行数,默认为1。
  • ncols:表示规划区域的列数,默认为1。
  • sharex,sharey:表示是否共享子图的x轴或y轴。
  • squeeze:表示是否返回压缩的Axes对象的数组,默认为True。
  • gridspec_kw:表示用于控制区域结构属性的字典。

subplots()函数会返回一个包含两个元素的元组,其中元组的第一个元素为Figure对象,第二个元素为Axes对象或Axse对象数组。

import matplotlib.pyplot as plt
fig,ax_arr=plt.subplots(2,2)
ax_thr=ax_arr[0,1]
ax_thr.plot([1,2,3,4,5])
plt.title("39")
plt.show()

运行代码,效果如下:

1.4、实例2
将整个画布规划成1x 2的矩阵区域
代码如下:

import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei']
def autolabel(ax,rects):for rect in rects:width= rect.get_width()ax.text(width+3,rect.get_y(),s='{}'.format(width),ha='center',va='bottom')
y=np.arange(12)
x1=np.array([20,28,23,16,57,36,39,33,6,19,21,25])
x2=np.array([17,22,39,15,35,23,25,11,29,38,28,50])
labels=np.array(['中国','加拿大','巴西','澳大利亚','日本','墨西哥','俄罗斯','韩国','瑞士','土耳其','英国','美国'])
fig,(ax1,ax2)=plt.subplots(1,2)
barh1_rects=ax1.barh(y,x1,height=0.5,tick_label=labels,color='#FFA500')
ax1.set_label('人群比例(%)')
ax1.set_title('部分国家养cat人群的比例 39')
ax1.set_xlim(0,x1.max()+10)
autolabel(ax1,barh1_rects)barh2_rects=ax2.barh(y,x2,height=0.5,tick_label=labels,color='#20B2AA')
ax2.set_label('人群比例(%)')
ax2.set_title('部分国家羊狗人群的比例 39')
ax2.set_xlim(0,x1.max()+10)
autolabel(ax2,barh2_rects)
plt.tight_layout()
plt.show()

运行代码效果如下:

二、绘制自定义区域的子图

2.1、绘制单子图
使用pyplot的subplot2grid()函数可以将整个画布规划成非等分布局的区域,并在可选的某个区域中绘制单个子图,语法格式如下:

subplot2grid(shape,loc,rowspan,colspan=1,fig=None,**kwargs)

该函数常用参数的含义如下:

  • shape:表示规划的区域结构,它是一个包含两个整数的元组,其中第一个元素表示规划区域的行数,第2个元素表示规划区域的列数。
  • loc:表示选择区域的位置,它是包含两个整型数据的元组。
  • rowspan:表示向下跨越的行数,默认为1。
  • colspan:表示向右跨越的列数,默认为1。
  • fig:表示放置子图的画布,默认为当前画布。

列如,将画布规划成3x 2的矩阵区域,并在0行第2列的区域中绘制子图。

import matplotlib.pyplot as plt
ax1=plt.subplot2grid((2,3),(0,2))
ax1.plot([1,2,3,4,5])
ax2=plt.subplot2grid((2,3),(1,0),colspan=2)
ax2.plot([1,2,3,4,5])
plt.title("39")
plt.show()

代码运行,效果如下:

2.2、实例
使用3个子图进行展示

import numpy as up
import matplotlib.pyplot as plt
plt.rcParams["font.sans-serif"] = ["SimHei"]
data_2017 = np.array([21,35,22,19,3])
data_2018 = np.array([13,32,27,27,1])
x = np.arange(5)
y = np.array([51,73,99,132,45])
labels = np.array(['一线城市','二线城市','三线城市','四线及以外','其他国家及地区'])
average = 75
bar_width = 0.5
def autolabel(ax,rects):for rect in rects:height = rect.get_height()ax.text(rect.get_x()+bar_width/2,height + 3,s = '{}'.format(height),ha = 'center',va = 'bottom')
ax_one = plt.subplot2grid((3,2),(0,0),rowspan=2,colspan=2)
bar_rects = ax_one.bar(x,y,tick_label=labels,color='#20B2AA',width=bar_width)
ax_one.set_title('抖音2018vs2017人群增长倍速 39')
ax_one.set_ylabel('增长倍速')
autolabel(ax_one,bar_rects)
ax_one.set_ylim(0,y.max()+20)
ax_one.axhline(y=75,linestyle='--',linewidth=1,color='gray')
ax_two = plt.subplot2grid((3,2),(2,0))
ax_two.pie(data_2017,radius = 1.5,labels = labels,autopct = '%3.1f%%',colors=['#2F4F4F','#FF0000','#A9A9A9','#FFD700','#B0C4DE'])
ax_thr.set_title('2017年抖音用户地区分布的比例')
plt.title("39")
ax_two = plt.subplot2grid((3,2),(2,1))
ax_two.pie(data_2018,radius = 1.5,labels = labels,autopct = '%3.1f%%',colors=['#2F4F4F','#FF0000','#A9A9A9','#FFD700','#B0C4DE'])
ax_thr.set_title('2018年抖音用户地区分布的比例')
plt.title("39")
plt.tight_layout()
plt.show

代码运行,效果:

三、共享子图的坐标轴

3.1、共享相邻子图的坐标轴当pyplot()函数绘制子图时,可以通过sharex或sharey参数控制是否享受x轴或y轴。

  • True或‘all’:表示所有子图之间共享x轴或y轴。
  • False或‘none’:表示所有子图之间不共享x轴或y轴。
  • ‘row’:表示每一行的子图之间共享x轴或y轴。
  • ‘col’:表示每一列的子图之间共享x轴或y轴。

例如,将画布规划成2 x 2的矩阵区域,在每一列子图之间共享x轴。示例代码如下:

import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['axes.unicode_minus']=False
x1=np.linspace(0,2*np.pi,400)
x2=np.linspace(0.01,10,100)
x3=np.random.rand(10)
x4=np.arange(0,6,0.5)
y1=np.cos(x1**2)
y2=np.sin(x2)
y3=np.linspace(0,3,10)
y4=np.power(x4,3)
fig,ax_arr=plt.subplots(2,2,sharex='col')
ax1=ax_arr[0,0]
ax1.plot(x1,y1)
ax2=ax_arr[0,1]
ax2.plot(x2,y2)
ax3=ax_arr[1,0]
ax3.scatter(x3,y3)
ax4=ax_arr[1,1]
ax4.scatter(x4,y4)
plt.title("39")
plt.show()

运行结果效果如下:

3.2、共享非相邻子图的坐标轴
当pyplot使用subplot()函数绘制子图时,也可以将代表其他子图的变量赋值给sharex或sharey参数,此时可以共享非相邻子图之间的坐标轴。

x1=np.linspace(0,2*np.pi,400)
y1=np.cos(x1**2)
x2=np.linspace(0.01,10,100)
y2=np.sin(x2)
ax_one=plt.subplot(221)
ax_one.plot(x1,y1)
ax_two=plt.subplot(224,sharex=ax_one)
ax_two.plot(x2,y2)
plt.title("39")
plt.show()

代码运行效果如下:

3.3、实例

import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams["axes.unicode_minus"]=False
month_x=np.arange(1,13,1)
data_tem=np.array([2.0,2.2,3.3,4.5,6.3,10.2,20.3,33.4,23.0,16.5,12.0,6.2])
data_precipitation=np.array([2.6,5.9,9.0,26.4,28.7,70.7,175.6,182.2,48.7,18.8,6.0,2.3])
data_evaporation=np.array([2.0,4.9,7.0,23.2,25.6,76.7,135.6,162.2,32.6,20.0,6.4,3.3])
fig,ax=plt.subplots()
bar_ev=ax.bar(month_x,data_precipitation,color='pink')
bar_pre=ax.bar(month_x,data_precipitation,bottom=data_evaporation,color='green')
ax.set_ylabel('水量(ml)')
ax.set_title('平均气温与降水量、蒸发量的关系 39')
ax_right=ax.twinx()
line=ax_right.plot(month_x,data_tem,'o-m')
ax_right.set_ylabel('气温($^\circ$C)')
plt.legend([bar_ev,bar_pre,line[0]],['蒸发量','降水量','平均气温'],shadow=True,fancybox=True)plt.show()

代码运行效果如下:

四、子图的布局

4.1、约束布局

import matplotlib.pyplot as plt
fig,axs=plt.subplots(2,2,constrained_layout=True)
ax_one=axs[0,0]
ax_one.set_title('Title 39')
ax_two=axs[0,1]
ax_two.set_title('Title 39')
ax_thr=axs[1,0]
ax_thr.set_title('Title 39')
ax_fou=axs[1,1]
ax_fou.set_title('Title 39')
plt.show()

代码运行效果如下:

4.2、紧密布局

import matplotlib.pyplot as plt
fig, axs=plt.subplots(2,2)
ax_one=axs[0,0]
ax_one.set_title('Title 39')
ax_two=axs[0,1]
ax_two.set_title('Title 39')
ax_thr=axs[1,0]
ax_thr.set_title('Title 39')
ax_fou=axs[1,1]
ax_fou.set_title('Title 39')
plt.tight_layout(pad=0.4,w_pad=0.5,h_pad=2)
plt.show()

代码运行效果:

4.3、自定义布局

import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
fig2=plt.figure()
spec2=gridspec.GridSpec(ncols=2,nrows=2,figure=fig2)
f2_ax1=fig2.add_subplot(spec2[0,0])
f2_ax2=fig2.add_subplot(spec2[0,1])
f2_ax3=fig2.add_subplot(spec2[1,0])
f2_ax4=fig2.add_subplot(spec2[1,1])
plt.title("39")
plt.show()

代码运行效果:

(2)

fig3=plt.figure()
gs=fig3.add_gridspec(3,3)
f3_ax1=fig3.add_subplot(gs[0,:])
f3_ax1.set_title('gs[0,:] 39')
f3_ax2=fig3.add_subplot(gs[1,:-1])
f3_ax2.set_title('gs[1,:-1 ]')
f3_ax3=fig3.add_subplot(gs[1:,-1])
f3_ax3.set_title('gs[1:,-1]')
f3_ax4=fig3.add_subplot(gs[-1,0])
f3_ax4.set_title('gs[-1,0]')
f3_ax5=fig3.add_subplot(gs[-1,-2])
f3_ax5.set_title('gs[-1,-2]')

代码运行效果:

4.4、实例

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
plt.rcParams["font.sans-serif"]=["SimHei"]
x_month=np.array(['1月','2月','3月','4月','5月','6月'])
y_sales=np.array([2150,1050,1560,1480,1530,1490])
x_citys=np.array(['北京','上海','广州','深圳','浙江','山东'])
y_sale_count=np.array([83775,62860,59176,64205,48671,39968])
fig=plt.figure(constrained_layout=True)
gs=fig.add_gridspec(2,2)
ax_one=fig.add_subplot(gs[0,:])
ax_two=fig.add_subplot(gs[1,0])
ax_thr=fig.add_subplot(gs[1,1])
ax_one.bar(x_month,y_sales,width=0.5,color='#3299CC')
ax_one.set_title(' 2018年上半年某品牌汽车销售额 39')
ax_one.set_ylabel('销售额(亿元)')
ax_two.plot(x_citys,y_sale_count,'m--o',ms=8)
ax_two.set_title(' 分公司某品牌汽车的销量 39')
ax_two.set_ylabel('销量(辆)')
ax_thr.stackplot(x_citys,y_sale_count,color='#9999EF')
ax_thr.set_title(' 分公司某品牌汽车的销量 39')
ax_thr.set_ylabel('销量(辆)')
plt.show()

运行效果:

数据可视化——子图的绘制及坐标轴共享相关推荐

  1. Python数据分析三剑客学习笔记Day6——matplotlib包的使用:数据可视化,简单绘制柱状图、曲线图、饼图、频率分布直方图

    本文是视频Python数据分析三剑客 数学建模基础 numpy.pandas.matplotlib的学习笔记. -------------------------------------------- ...

  2. python数据可视化之简单绘制简单折线图

    python数据可视化之简单绘制简单折线图 1. 首先安装matplotlib liunx安装命令: $ sudo apt-get install python3-matplotlib windows ...

  3. python 3d大数据可视化_Python大数据可视化编程实践-绘制图表

    Python 数据可视化编程实践 - 绘制图表 准备工作 打开 Jupyter Notebook ,导入需要的包, 并配置好图片交互和中文显示环 境: import pandas as pd impo ...

  4. 数据可视化——R语言绘制散点相关图并自动添加相关系数和拟合方程

    数据可视化--R语言绘制散点相关图并自动添加相关系数和拟合方程 加载所需的包并设置主题样式 示例数据 基本的散点相关图 添加相关系数和显著性水平(P值) 存在多个组别的散点相关图 自动添加回归曲线的拟 ...

  5. 【数据可视化(图形绘制)攻略】——配对样本T检验/Wilcoxon配对秩检验

    配对样本T检验/Wilcoxon配对秩检验的数据可视化(图形绘制)攻略 ggpubr包的应用 配对T检验和Wilcoxon配对非参数检验的图形可视化均可以应用ggpubr包,简单好用.可达到如下效果哟 ...

  6. H5数据可视化(高德地图绘制行政区)

    1.高德地图可视化项目搭建 参考我的上篇文章完成基本搭建:H5数据可视化(高德地图构建项目) 2.使用高德行政区查询 该部分主要参照官方教程即可,其中使用行政区划查询服务前要先引入该插件,具体的引入方 ...

  7. 【数据可视化应用】绘制类别插值地图(附Python代码)

    sklearn.KNeighborsClassifier() 终于这篇推文将机器学习和可视化完美的结合起来,即:机器学习处理数据,数据可视化技术展现.美化数据(以后的深度学习部分也会延续这个风格,只不 ...

  8. matplotlib数据可视化 — 初级图形绘制

    第一部分主要作用是构建出一张空白的画布,并可以选择是否将整个画布划分为多个部分,方便在同一幅图上绘制多个图形的情况.最简单的绘图可以省略第一部分,而后直接在默认的画布上进行图形绘制 第二部分是绘图的主 ...

  9. python:数据可视化 相关系数热力图绘制

    仅十余行代码可实现可视化的相关系数矩阵热力图 把相关系数的展示做成热力图,展示更为直观并且方便与他人交流 主要用到的是seaborn库里的heatmap()函数 1.准备相关包 import pand ...

最新文章

  1. 面试 | 22道机器学习常见面试题目
  2. .NET Core EntityFramework生成自动增长的主键
  3. bash魔法堂:History用法详解
  4. 功能之前,感叹号有什么作用?
  5. [云炬创业基础笔记]做好市场调研
  6. Qt学习(五):TCP通信
  7. 远程连接服务器出现身份验证错误 要求的函数不受支持
  8. 【WebRTC---入门篇】(十六)端对端1V1传输基本流程
  9. (十四)【RecSys 2016】Personalized Recommendations using Knowledge Graphs: A Probabilistic【看不懂】
  10. Django,js,html数据传输
  11. could not read data from '/Users/xxxx/myapp-Info.plist'
  12. Java常用的几个Json库
  13. Study 7 —— CSS美化背景和边框
  14. 微信iOS收款到账语音提醒开发总结
  15. 牛X的规则引擎urule2
  16. python泊松_Poisson Distribution——泊松分布
  17. 如何下载网页中的视频文件?
  18. 如何设置U盘为第一启动项,在安装windows操作系统时如何从U盘启动?
  19. 遥感图像场景分类方法总结
  20. PS 图像调整算法——反相

热门文章

  1. JavaScript手机号码号段校验
  2. 6/7/8/9/10/11代主板刷bios跳过校验方法刷修改bios自制bios方法
  3. 下载maven私服所有jar包
  4. platform驱动的probe过程
  5. 响应式设计和移动端优化:如何实现页面在不同设备上的适配和优化
  6. 暗黑2浴火重生zclient注册账号
  7. 搭建Opengrok
  8. 百度 腾讯 阿里 小米 笔试题目宝典
  9. 生信漫谈分析杨梅UDP-糖基转移酶基因家族
  10. 衡量企业网络广告效果的九个指标