python --在2x2的子图中绘制三个子图,并使第三个子图居中

news2024/11/20 20:34:08

python – 在2x2的子图中绘制三个子图,并使第三个子图居中

基于python,绘制一个2x2的子图范围,但是只显示3个子图,并使得第三个子图居中显示’
思路:

  • 建立一个2x2的子图
  • 前两个正常画,其中第三个子图跨越两行。
  • 第三个子图通过set_position 来调整大小和位置,使其视觉上看起来居中显示

以下是封装的绘图函数:

from matplotlib import ticker 
import matplotlib.pyplot as plt
import cartopy.feature as cfeature
from cartopy.mpl.ticker import LongitudeFormatter, LatitudeFormatter
import cartopy.crs as ccrs
import numpy as np
import  cmaps
from matplotlib.gridspec import GridSpec
def make_map(ax, title): 
    ax.set_extent(box, crs=ccrs.PlateCarree())
    land = cfeature.NaturalEarthFeature('physical',
                                        'land',
                                        '50m',
                                        edgecolor='gray', 
                                        facecolor='None',
                                        )
    ax.add_feature(land)  # set land color
    ax.coastlines()  # set coastline resolution
    gl = ax.gridlines(draw_labels=True, 
                      linewidth=0.5, 
                      color='gray', 
                      alpha=0.5, 
                      linestyle='--')

    gl.top_labels = False  # 不显示上边界的标签
    gl.right_labels = False  # 不显示右边界的标签
    gl.xlocator = ticker.MultipleLocator(base=30)  
    gl.ylocator = ticker.MultipleLocator(base=30)
    ax.set_title(title, fontsize=25, loc='center')
    # ax.tick_params(which='both', 
    #                direction='out', 
    #                length=8,
    #                width=0.99, 
    #                pad=0.2, 
    #                labelsize=20,
    #                bottom=True, left=True, right=True, top=True)
 
    return ax
  • 封装函数的好处在于重复绘制相关格式的子图时,减少重复代码
  • 上述封装的绘图函数,可以实现:1、指定显示的绘图空间范围;2、陆地投影、海岸线;3、网格以及默认标签;4、标题;5、最小刻度线间隔
  • 由于这里关于刻度线使用的是gridlines,对于刻度线的朝向和长短暂时没有找到好的方法进行控制,这个是投影地图上的一个bug感觉,在proplot这个绘图函数里面也有类似的问题;解决办法呢,需要自己手动添加tick,然后通过tick_params来实现;

如下所示:

def make_map(ax, title): 
    ax.set_extent(box, crs=ccrs.PlateCarree())
    land = cfeature.NaturalEarthFeature('physical',
                                        'land',
                                        '50m',
                                        edgecolor='gray', 
                                        facecolor='None',
                                        )
    ax.add_feature(land)  # set land color
    ax.coastlines()  # set coastline resolution
    
    ax.set_xticks(np.arange(-90, 91, 30), crs=ccrs.PlateCarree())
    ax.set_yticks(np.arange(-30, 31, 30), crs=ccrs.PlateCarree())
    ax.xaxis.set_major_formatter(LongitudeFormatter(zero_direction_label=False))
    ax.yaxis.set_major_formatter(LatitudeFormatter())
    
    ax.xaxis.set_minor_locator(ticker.AutoMinorLocator(n=5) )
    ax.yaxis.set_minor_locator(ticker.AutoMinorLocator(n=3))
    ax.xaxis.set_major_formatter(lon_formatter)
    ax.yaxis.set_major_formatter(lat_formatter)
    ax.set_title(title, fontsize=25, loc='center')
    ax.tick_params(which='both', 
                    direction='out', 
                    length=8,
                    width=0.99, 
                    pad=0.2, 
                    labelsize=20,
                    bottom=True, left=True, right=True, top=True)
 
    return ax

然后,对于子图的设置,这里使用的是GridSpec 对象,代码如下所示,


proj = ccrs.PlateCarree(central_longitude=0)

fig = plt.figure(figsize=(16, 8), dpi=200)
gs = GridSpec(2, 2, figure=fig, width_ratios=[1, 1], height_ratios=[1, 1])
ax = [plt.subplot(gs[0, 0], projection=proj), plt.subplot(gs[0, 1], projection=proj),
      plt.subplot(gs[1, :2], projection=proj)]

title = ['Zonal Wind', 'Meridional Wind', 'Height']
box = [-91, 91, -35, 35]  

for i, var in enumerate([u, v, h]):
    make_map(ax[i], title[i])
    plot = ax[i].contourf(lon, lat, var.T, cmap=cmaps.BlueWhiteOrangeRed,transform=ccrs.PlateCarree())
    ax[i].set_extent(box, crs=ccrs.PlateCarree())  

# 设置第三个子图的位置
ax[2].set_position([0.25, 0.1, 0.5, 0.8])

# 调整子图间距
plt.subplots_adjust(hspace=0.4)

得到的绘图结果就是下面这个样子:

在这里插入图片描述

这里仅仅做一个尝试,当然,没有必要非得让它居中嘛:

proj = ccrs.PlateCarree(central_longitude=0)

fig, ax = plt.subplots(nrows=2, ncols=2, figsize=(16, 10), dpi=200,
                       subplot_kw={'projection': proj})

title = ['u', 'v', 'h']
box = [-91, 91, -35, 35]  

for i, var in enumerate([u, v, h]):
    print(i)
    make_map(ax.flatten()[i], title[i])
    plot = ax.flatten()[i].contourf(lon, lat, var.T, 
                                    cmap=cmaps.BlueWhiteOrangeRed,
                                    transform=ccrs.PlateCarree())
    ax.flatten()[i].set_extent(box, crs=ccrs.PlateCarree())  
    # 删除最后一个子图
fig.delaxes(ax.flatten()[3])

# fig.subplots_adjust(hspace=0.1)

# 显示图形
plt.show()

# 显示图形
plt.show()

就下面这样也很好,或者干脆就是一个1x3或者3x1的子图分布也可以,实在不行,后期通过ai也可以任意拼接
在这里插入图片描述
全部的绘图代码:




def make_map(ax, title): 
    ax.set_extent(box, crs=ccrs.PlateCarree())
    land = cfeature.NaturalEarthFeature('physical',
                                        'land',
                                        '50m',
                                        edgecolor='gray', 
                                        facecolor='None',
                                        )
    ax.add_feature(land)  # set land color
    ax.coastlines()  # set coastline resolution
    gl = ax.gridlines(draw_labels=True, 
                      linewidth=0.5, 
                      color='gray', 
                      alpha=0.5, 
                      linestyle='--')

    gl.top_labels = False  # 不显示上边界的标签
    gl.right_labels = False  # 不显示右边界的标签
    gl.xlocator = ticker.MultipleLocator(base=30)  
    gl.ylocator = ticker.MultipleLocator(base=30)
    ax.set_title(title, fontsize=25, loc='center')
 
    return ax
proj = ccrs.PlateCarree(central_longitude=0)
fig = plt.figure(figsize=(16, 8), dpi=200)
gs = GridSpec(2, 2, figure=fig, width_ratios=[1, 1], height_ratios=[1, 1])
ax = [plt.subplot(gs[0, 0], projection=proj), plt.subplot(gs[0, 1], projection=proj),
      plt.subplot(gs[1, :2], projection=proj)]

title = ['Zonal Wind', 'Meridional Wind', 'Height']
box = [-91, 91, -35, 35]  

for i, var in enumerate([u, v, h]):
    make_map(ax[i], title[i])
    plot = ax[i].contourf(lon, lat, var.T, cmap=cmaps.BlueWhiteOrangeRed,transform=ccrs.PlateCarree())
    ax[i].set_extent(box, crs=ccrs.PlateCarree())  

# 设置第三个子图的位置
ax[2].set_position([0.25, 0.1, 0.5, 0.8])

# 调整子图间距
plt.subplots_adjust(hspace=0.4)
plt.show()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1064305.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[开源项目推荐]privateGPT使用体验和修改

文章目录 一.跑通简述二.解读ingest.py1.导入库和读取环境变量2.文档加载3.文档处理(调用文件加载函数和文本分割函数) 三.injest.py效果演示1.main函数解读2.测试 四.修改代码,使之适配多知识库需求1.修改配置文件:constants.py2…

H桥级联型五电平三相逆变器Simulink仿真模型

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

天线基础知识概述

一、天线方向图(一) 图1 天线方向图的辐射能量 辐射能量完全集中在天线方向图的主瓣。这样就不会有副瓣。所有的辐射能量都在天线的半功率波束宽度内。在这些−3dB边界之外,没有能量辐射。在−3dB范围内,能量分布均匀。为了能够对天线进行计算,通常会对计算进行一些简化甚…

MATLAB中syms函数使用

目录 语法 说明 示例 创建符号标量变量 创建符号标量变量的向量 创建符号标量变量矩阵 管理符号标量变量的假设 创建和评估符号函数 syms函数的作用是创建符号标量和函数,以及矩阵变量和函数。 语法 syms var1 ... varN syms var1 ... varN [n1 ... nM] …

VBA_MF系列技术资料1-197

MF系列VBA技术资料 为了让广大学员在VBA编程中有切实可行的思路及有效的提高自己的编程技巧,我参考大量的资料,并结合自己的经验总结了这份MF系列VBA技术综合资料,而且开放源码(MF04除外),其中MF01-04属于定…

剑指offer——JZ27 二叉树的镜像 解题思路与具体代码【C++】

一、题目描述与要求 二叉树的镜像_牛客题霸_牛客网 (nowcoder.com) 题目描述 操作给定的二叉树,将其变换为源二叉树的镜像。 数据范围:二叉树的节点数 0≤n≤1000 , 二叉树每个节点的值 0≤val≤1000 要求: 空间复杂度 O(n) …

批量输出生成宗地图斑界址点成果表,支持自动分页,纯FME实现

目录 一、实现效果 二、实现过程 1.图斑转点 2.设置界址点号 3.计算界址点输出Excel的位置 4.计算边长 5.提取每页最后一个界址点 6.设置界址点成果表其他信息 7.输出Excel 三、总结 制作图斑界址点成果表是经常遇到的工作,除了要输出界址点坐标&#xff…

Docker基本操作【一篇学会项目部署】

文章目录 一、Docker简介二、Docker安装三、配置镜像加速四、Docker部署五、Docker基础操作1. 常见命令2. 操作演示3. 数据卷①nginx的html目录挂载②分析匿名数据卷③MySQL的本地目录挂载 4. 自定义镜像①Dockerfile②构建镜像 5. 网络①常见命令②自定义网络 六、DockerCompo…

五种雷达波束模式简介及其应用场景

图1 雷达天线方向图一览 一、铅笔光束——Pencil beam: 方位角和仰角都很窄的光束(像铅笔一样细);用于三维雷达,如仪表雷达、天气雷达和防空雷达。 二、扇形波束——Fan beam 方位角非常窄(接近1至2)&am…

Spring框架数据访问

🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🦄 博客首页——🐅🐾猫头虎的博客🎐 🐳 《面试题大全专栏》 🦕 文章图文…

机器学习:随机森林

集成学习 集成学习(Ensemble Learning)是一种机器学习方法,通过将多个基本学习算法的预测结果进行组合,以获得更好的预测性能。集成学习的基本思想是通过结合多个弱分类器或回归器的预测结果,来构建一个更强大的集成模…

《Spring框架前世今生》

🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🦄 博客首页——🐅🐾猫头虎的博客🎐 🐳 《面试题大全专栏》 🦕 文章图文…

Meta分析的流程及方法

Meta分析是针对某一科研问题,根据明确的搜索策略、选择筛选文献标准、采用严格的评价方法,对来源不同的研究成果进行收集、合并及定量统计分析的方法,最早出现于“循证医学”,现已广泛应用于农林生态,资源环境等方面。…

基于SSM的在线电影评价系统设计与实现

末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:采用JSP技术开发 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目&#x…

LVGL_基础控件滑动条slider

LVGL_基础控件滑动条slider 1、创建滑动条控件 // 创建一个 slider 组件(对象),他的父对象是活动屏幕对象 lv_obj_t *slider lv_slider_create(lv_scr_act()); LV_LOG_USER("lv_slider_get_value(slider) %d", lv_slider_get_value(slider));/* 设置位…

Python 办公自动化Excel修改数据

如何修改Excel 符合条件的数据?用Python 几行代码搞定。 需求:将销售明细表的产品名称为PG手机、HW手机、HW电脑的零售价格分别修改为4500、5500、7500,并保存Excel文件。如下图 Python 修改Excel 数据,常见步骤: 1&…

Git分布式版本控制工具(学习git,这一篇就够了)

1.1、Git Git 是分布式的 ,Git 不需要有中心服务器,我们每台电脑拥有的东西都是一样的。我们使用 Git 并且有个 中心服务器,仅仅是为了方便交换大家的修改,但是这个服务器的地位和我们每个人的 PC 是一样的。我们可以 把它当做一个开发者的…

MFC文本输出学习

void CTxttstView::OnDraw(CDC* pDC) {CTxttstDoc* pDoc GetDocument();ASSERT_VALID(pDoc);// TODO: add draw code for native data hereCString str1;pDC->SetBkColor(RGB(0,0,0));pDC->TextOut(50, 50, "一段文字");pDC->SetBkColor(RGB(255,255,255))…

openGauss学习笔记-91 openGauss 数据库管理-内存优化表MOT管理-内存表特性-使用MOT-MOT使用MOT外部支持工具

文章目录 openGauss学习笔记-91 openGauss 数据库管理-内存优化表MOT管理-内存表特性-使用MOT-MOT使用MOT外部支持工具91.1 gs_ctl(全量和增量)91.2 gs_basebackup91.3 gs_dump91.4 gs_restore openGauss学习笔记-91 openGauss 数据库管理-内存优化表MOT…

Spring MVC工作原理

🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🦄 博客首页——🐅🐾猫头虎的博客🎐 🐳 《面试题大全专栏》 🦕 文章图文…