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

2023-10-07 06:20

本文主要是介绍python --在2x2的子图中绘制三个子图,并使第三个子图居中,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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 colorax.coastlines()  # set coastline resolutiongl = 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 colorax.coastlines()  # set coastline resolutionax.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 colorax.coastlines()  # set coastline resolutiongl = 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()

这篇关于python --在2x2的子图中绘制三个子图,并使第三个子图居中的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/156600

相关文章

Python实现Word转PDF全攻略(从入门到实战)

《Python实现Word转PDF全攻略(从入门到实战)》在数字化办公场景中,Word文档的跨平台兼容性始终是个难题,而PDF格式凭借所见即所得的特性,已成为文档分发和归档的标准格式,下面小编就来和大... 目录一、为什么需要python处理Word转PDF?二、主流转换方案对比三、五套实战方案详解方案1:

基于Python Playwright进行前端性能测试的脚本实现

《基于PythonPlaywright进行前端性能测试的脚本实现》在当今Web应用开发中,性能优化是提升用户体验的关键因素之一,本文将介绍如何使用Playwright构建一个自动化性能测试工具,希望... 目录引言工具概述整体架构核心实现解析1. 浏览器初始化2. 性能数据收集3. 资源分析4. 关键性能指

使用Python的requests库调用API接口的详细步骤

《使用Python的requests库调用API接口的详细步骤》使用Python的requests库调用API接口是开发中最常用的方式之一,它简化了HTTP请求的处理流程,以下是详细步骤和实战示例,涵... 目录一、准备工作:安装 requests 库二、基本调用流程(以 RESTful API 为例)1.

Python清空Word段落样式的三种方法

《Python清空Word段落样式的三种方法》:本文主要介绍如何用python-docx库清空Word段落样式,提供三种方法:设置为Normal样式、清除直接格式、创建新Normal样式,注意需重... 目录方法一:直接设置段落样式为"Normal"方法二:清除所有直接格式设置方法三:创建新的Normal样

Python调用LibreOffice处理自动化文档的完整指南

《Python调用LibreOffice处理自动化文档的完整指南》在数字化转型的浪潮中,文档处理自动化已成为提升效率的关键,LibreOffice作为开源办公软件的佼佼者,其命令行功能结合Python... 目录引言一、环境搭建:三步构建自动化基石1. 安装LibreOffice与python2. 验证安装

把Python列表中的元素移动到开头的三种方法

《把Python列表中的元素移动到开头的三种方法》在Python编程中,我们经常需要对列表(list)进行操作,有时,我们希望将列表中的某个元素移动到最前面,使其成为第一项,本文给大家介绍了把Pyth... 目录一、查找删除插入法1. 找到元素的索引2. 移除元素3. 插入到列表开头二、使用列表切片(Lis

Python按照24个实用大方向精选的上千种工具库汇总整理

《Python按照24个实用大方向精选的上千种工具库汇总整理》本文整理了Python生态中近千个库,涵盖数据处理、图像处理、网络开发、Web框架、人工智能、科学计算、GUI工具、测试框架、环境管理等多... 目录1、数据处理文本处理特殊文本处理html/XML 解析文件处理配置文件处理文档相关日志管理日期和

Python标准库datetime模块日期和时间数据类型解读

《Python标准库datetime模块日期和时间数据类型解读》文章介绍Python中datetime模块的date、time、datetime类,用于处理日期、时间及日期时间结合体,通过属性获取时间... 目录Datetime常用类日期date类型使用时间 time 类型使用日期和时间的结合体–日期时间(

使用Python开发一个Ditto剪贴板数据导出工具

《使用Python开发一个Ditto剪贴板数据导出工具》在日常工作中,我们经常需要处理大量的剪贴板数据,下面将介绍如何使用Python的wxPython库开发一个图形化工具,实现从Ditto数据库中读... 目录前言运行结果项目需求分析技术选型核心功能实现1. Ditto数据库结构分析2. 数据库自动定位3

Python yield与yield from的简单使用方式

《Pythonyield与yieldfrom的简单使用方式》生成器通过yield定义,可在处理I/O时暂停执行并返回部分结果,待其他任务完成后继续,yieldfrom用于将一个生成器的值传递给另一... 目录python yield与yield from的使用代码结构总结Python yield与yield