当前位置: 首页 > news >正文

[学习笔记]python绘制图中图(绘制站点分布图)

背景

在绘制站点分布图时,有时需要采用图中图的方式,以便于在一张图中尽可能多的表达信息。此处记录一下利用python matplotlib绘制图中图的脚本,方便然后查询。

包含数据

该绘图脚本中包含以下数据:

  1. CMONOC站点分布(蓝色点)
  2. CMONOC穿刺点分布(灰色点)
  3. 某研究中采用的位于湖北省附近的一些地面跟踪站分布(红色点)
绘制思路

首先将CMONOC站点以及穿刺点分布画上,再通过plt.axes在图上再加一块画布绘制小范围的地图,接着在小范围的地图上标点。为了方便在大范围地图上找到图中图的位置,也要在相应位置上用红框标记下,这里采用了plt.vlines和plt.hlines两者结合的方法。

代码

注:此处仅提供绘图脚本,其中用到的部分站点坐标文件因一些原因不能公开。

from mpl_toolkits.basemap import Basemap
import matplotlib.pyplot as plt
import matplotlib.patches as mpathes
import numpy as np
import os
from adjustText import adjust_text  # 导入文字调整的库函数outputDir = './cmonoc_ipp/'
if not os.path.exists(outputDir):  # True/Falseos.mkdir(outputDir)colors_lst = ['blue', 'magenta', 'darkolivegreen', 'mediumpurple', 'palevioletred', 'cadetblue']
site_list = r'xxxxxxxxxxxx/ofilelst.txt' # 测站名列表路径
ccl_file_dir = r'xxxxxxxxxxxxxxxxxxxxx/cclFileCmonoc/' # 穿刺点文件路径# 读取测站列表文件(含经纬度及站点名称)
f = open(site_list, 'r')
ObsLines = f.readlines()rec_name = []
for i in range(len(ObsLines)):fields = ObsLines[i].split()rec_name.append(fields[0])plt.figure(figsize=(6, 4.5))  # 设置大小和分辨率
plt.rcParams['font.sans-serif'] = ['arial']lat_range = range(-15, 60 + 10, 10)
lon_range = range(60, 150 + 10, 10)m = Basemap(projection='cyl', lon_0=110, lat_0=20, resolution='h', llcrnrlon=60, urcrnrlon=150,llcrnrlat=-10, urcrnrlat=60)
m.drawcoastlines(color='black', linewidth=0.8)
# draw parallels and meridians.
m.drawmeridians(range(70, 150 + 20, 20), labels=[0, 0, 1, 1], color='gray', linewidth=0.8, font='arial', fontsize=10)
m.drawparallels(range(0, 60, 10), labels=[1, 1, 0, 0], color='gray', linewidth=0.8, font='arial', fontsize=10)for i in range(len(rec_name)):site = rec_name[i][2:6]print('Porcessing site: ', site, '...')file_name = site + '_2023_091.ccl'arc_file = ccl_file_dir + file_nameprint('Processing the file: ', file_name)sec = []ipp = []elev = []site_lst = []with open(arc_file, "r") as f:for line in f.readlines():line = line.split()# if line[4] != 'W05':#     continuesec.append(int(line[2]))ipp.append([float(line[20]), float(line[21])])elev.append(float(line[5]))site_lst.append(site)lon = []lat = []for k in range(len(sec)):lon_tmp, lat_tmp = m(ipp[k][1], ipp[k][0])lon.append(lon_tmp)lat.append(lat_tmp)plt.scatter(lon, lat, s=0.0001, c='silver', zorder=100)# plt.plot(lon, lat, marker='o', color='grey', markersize=0.1, zorder=100)# CMONOC坐标列表路径
listFile = r'E:/DoctoralStudy/2python_prog/plotSiteMap0615/sitelist/site_pos_cmonoc.txt'# 读取测站列表文件(含经纬度及站点名称)
f = open(listFile, 'r')
ObsLines = f.readlines()lon = []
lat = []
staname = []
for i in range(len(ObsLines)):fields = ObsLines[i].split()# print(fields[0], fields[1], fields[2])lon.append(float(fields[0]))lat.append(float(fields[1]))staname.append(fields[2])lon, lat = m(lon, lat)
# ----------在地图上绘制坐标点------------#
for i in range(len(staname)):# m.scatter(lon[i],#           lat[i],#           s=20,#           c='red',#           marker='o')plt.plot(lon[i], lat[i], marker='s', color='blue', markersize=3, zorder=100) # CMONOC站点# 标记图中图位置,红色线
plt.vlines(108, ymin=24, ymax=36, colors='r', zorder=100)
plt.vlines(124, ymin=24, ymax=36, colors='r', zorder=100)
plt.hlines(24, xmin=108, xmax=124, colors='r', zorder=100)
plt.hlines(36, xmin=108, xmax=124, colors='r', zorder=100)# 绘制图中图
plt.axes([0.54, 0.15, 0.34, 0.28])
plt.rcParams['axes.facecolor'] = 'white'
m = Basemap(projection='cyl', lon_0=110, lat_0=20, resolution='h', llcrnrlon=108, urcrnrlon=124, llcrnrlat=24,urcrnrlat=36)
m.drawcoastlines(color='grey', linewidth=0.8)
# 图中图经纬度标注受大图影响,标注时打开bbox使其有白色背景,增强可读性
m.drawmeridians(np.arange(100, 124+4, 4), labels=[0, 0, 0, 1], color='gray', linewidth=0.8, font='arial',fontsize=10, bbox=dict(facecolor="white", edgecolor="white", pad=0.4))
m.drawparallels(np.arange(26, 36+4, 4), labels=[1, 0, 0, 0], color='gray', linewidth=0.8, font='arial',fontsize=10, bbox=dict(facecolor="white", edgecolor="white", pad=0.4))# 读取测站列表文件(含经纬度及站点名称)
listFile = r'D:/TempDataBackup/LEOData/091DataProc/site_pos_leo.txt'
f = open(listFile, 'r')
ObsLines = f.readlines()lon = []
lat = []
staname = []
for i in range(len(ObsLines)):fields = ObsLines[i].split()# print(fields[0], fields[1], fields[2])lon.append(float(fields[0]))lat.append(float(fields[1]))staname.append(fields[2])lon, lat = m(lon, lat)
# ----------在地图上绘制坐标点,添加文字------------#
for i in range(len(staname)):# m.scatter(lon[i],#           lat[i],#           s=20,#           c='red',#           marker='o')plt.plot(lon[i], lat[i], marker='o', color='red', markersize=5, zorder=100)
# 此处可以直接使用 m.scatter(lon,lat)# ---------在坐标点添加文字------#
texts = []
for i in range(len(staname)):texts.append(plt.text(lon[i],  # 坐标lat[i],staname[i],  # 文字字符串font='arial',fontsize=10,style="italic",weight="normal",verticalalignment='center',horizontalalignment='right',rotation=0, zorder=100))  # 给散点加标签
adjust_text(texts, only_move={'text': 'xy'},)fig_name = outputDir + 'cmonoc091IPPTrack.tif'
plt.savefig(fig_name, dpi=600, bbox_inches='tight', pad_inches=0.1)  # 输出地图,并设置边框空白紧密
plt.show()  # 将图像显示出来
最后成图

在这里插入图片描述

相关文章:

[学习笔记]python绘制图中图(绘制站点分布图)

背景 在绘制站点分布图时,有时需要采用图中图的方式,以便于在一张图中尽可能多的表达信息。此处记录一下利用python matplotlib绘制图中图的脚本,方便然后查询。 包含数据 该绘图脚本中包含以下数据: CMONOC站点分布&#xff…...

回归预测 | Matlab实现POA-CNN-SVM鹈鹕算法优化卷积神经网络-支持向量机多变量回归预测

Matlab实现POA-CNN-SVM鹈鹕算法优化卷积神经网络-支持向量机多变量回归预测 目录 Matlab实现POA-CNN-SVM鹈鹕算法优化卷积神经网络-支持向量机多变量回归预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.POA-CNN-SVM鹈鹕算法优化卷积神经网络-支持向量机的多变量回归…...

React 学习笔记

React React.js是一个开源的JavaScript库,由Facebook于2013年开发,用于构建用户界面或UI组件。它主要用于构建单页应用程序或SPA,并且可以在Web和移动应用程序中使用。React.js使用虚拟DOM来提高性能,并使用组件化的方式来实现代…...

单链表的查找(按值查找、按位查找)(数据结构与算法)

什么是单链表? 单链表是一种常见的链式数据结构,用于存储和操作数据元素的集合。它由一系列的节点组成,每个节点包含两个部分:数据域和指针域。 单链表的每个节点包含了存储数据的数据域,以及指向下一个节点的指针域。…...

Qt 6.6 发布

@TOC 前言 Qt 6.6 发布于2023年10月10日 https://www.qt.io/blog/qt-6.6-releasedQt 6.6 系列源码下载 https://download.qt.io/official_releases/qt/6.6/Qt 在线安装器下载 https://download.qt.io/official_releases/online_installers/国内镜像下载 在线安装器(维护工具)…...

unity工程

1首先我们来熟悉一下Unity每个文件夹的作用 1.assets:工程资源文件夹 2.library:库文件夹 3.logs:日志文件夹 4.obj:编译产生中间文件 5.packages:包配置信息 6:projectsettings:工程设置…...

蓝桥杯官网练习题(地址转换)

题目描述 Excel 是最常用的办公软件。每个单元格都有唯一的地址表示。比如:第 12 行第 4 列表示为:"D12",第 5 行第 255 列表示为"IU5"。 事实上,Excel 提供了两种地址表示方法,还有一种表示法叫…...

力扣labuladong——一刷day19

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、力扣303. 区域和检索 - 数组不可变二、力扣304. 二维区域和检索 - 矩阵不可变 前言 巧用前缀和 前缀和技巧适用于快速、频繁地计算一个索引区间内的元素之…...

MyBatis无法读取XML中的Method的乌龙事件

事件背景 同事反馈,相同的jar包,在多人本地的电脑、多台服务器中,都是可以正常启动的,只有在其中一台服务器,简称它为A,无法启动,因为启动后的初始化操作中有一个调用mybatis方法的操作&#x…...

LeetCode----76. 最小覆盖子串

 题目 给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串 “” 。 注意: 对于 t 中重复字符,我们寻找的子字符串中该字符数量必须不少于 t 中该字符数量。 如果 s 中存在这样的子串,我们保…...

app逆向入门之车智赢

声明:本文仅限学习交流使用,禁止用于非法用途、商业活动等。否则后果自负。如有侵权,请告知删除,谢谢!本教程也没有专门针对某个网站而编写,单纯的技术研究 目录 案例分析技术依赖参数分析效果展示代码分享…...

LeetCode——数组 移除元素(Java)

移除元素 简介[简单] 27. 移除元素[简单] 26. 删除有序数组中的重复项[简单] 283. 移动零[简单] 844. 比较含退格的字符串[简单] 977. 有序数组的平方 简介 记录一下自己刷题的历程以及代码。写题过程中参考了 代码随想录。会附上一些个人的思路,如果有错误&#x…...

enum和Collection.stream()你这样用过么

最近在做一个数据图表展示的功能,显示订单近七天或者近半月的数量和金额。可以理解成下图所示的样子: 我是用枚举和集合的stream方法实现的数据初始化和组装,枚举用来动态初始化时间范围,集合的stream方法来将初始化的数据转换成…...

unittest与pytest的区别

Unittest vs Pytest 主要从用例编写规则、用例的前置和后置、参数化、断言、用例执行、失败重运行和报告这几个方面比较unittest和pytest的区别: 用例编写规则 用例前置与后置条件 断言 测试报告 失败重跑机制 参数化 用例分类执行 如果不好看,可以看下面表格&…...

YOLOv7优化策略:IOU系列篇 | 引入MPDIoU,WIoU,SIoU,EIoU,α-IoU等创新

💡💡💡本文独家改进:MPDIoU,WIoU,SIoU,EIoU,α-IoU等二次创新,总有一种适合你的数据集 MPDIoU,WIoU,SIoU,EIoU,α-IoU | 亲测在多个数据集能够实现大幅涨点 收录: YOLOv7高阶自研专栏介绍: http://t.csdnimg.cn/tYI0c ✨✨✨前沿最新计算机顶会复现 …...

SQL Server2000mdf升级SQL Server2005数据库还原

SQL Server2000数据库还原sqlserver 2000mdf升级 sqlserver 2008数据库还原SQL Server2005数据库脚本 sqlserver数据库低版本升级成高版本 sqlserver数据库版本升级 数据库版本还原 如果本机安装了sqlserver2012或者sqlserver2019等高版本 怎么样才能运行sqlserver2000的数据库…...

webSocket推送太快导致前端渲染卡顿问题优化

优化思路: 把webSocket接收到的数据用一个数组存起来,达到一定长度再统一渲染,可根据推送数据的速度适当调解数组长度限制,如果一段时间内改数组长度打不要渲染条件,就用定时器之间渲染 data() {return {tempDataWsLi…...

(Java)泛型总结

泛型类 public class Student<E> {private E a;public Student(E a){this.aa;}public void show(){System.out.println(a);} } 泛型方法 public <E> void show(E a){System.out.println(a);} 泛型接口 public interface Inter <T>{void show(T a); } 类…...

C++ Package继承层次,采用继承实现快递包裹的分类计价(分为空运2日达、陆运3日达)。

一、问题描述&#xff1a; Package继承层次&#xff0c;采用继承实现快递包裹的分类计价&#xff08;分为空运2日达、陆运3日达&#xff09;。自定义一个或多个快递公司&#xff0c;自定义计价方法&#xff0c;设计合适、合理的界面文本提示&#xff0c;以广东省内某市为起点&…...

中文大语言模型汇总

推荐一篇非常棒的github&#xff1a;Awesome-Chinese-LLM 另附语言模型排行榜&#xff1a;FastChat 里面总结了几乎所有目前主流的中文大语言模型。在此记录一下&#xff0c;方便以后慢慢学习。...

云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地

借阿里云中企出海大会的东风&#xff0c;以**「云启出海&#xff0c;智联未来&#xff5c;打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办&#xff0c;现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...

【Linux】C语言执行shell指令

在C语言中执行Shell指令 在C语言中&#xff0c;有几种方法可以执行Shell指令&#xff1a; 1. 使用system()函数 这是最简单的方法&#xff0c;包含在stdlib.h头文件中&#xff1a; #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...

AtCoder 第409​场初级竞赛 A~E题解

A Conflict 【题目链接】 原题链接&#xff1a;A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串&#xff0c;只有在同时为 o 时输出 Yes 并结束程序&#xff0c;否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...

vue3 定时器-定义全局方法 vue+ts

1.创建ts文件 路径&#xff1a;src/utils/timer.ts 完整代码&#xff1a; import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...

tree 树组件大数据卡顿问题优化

问题背景 项目中有用到树组件用来做文件目录&#xff0c;但是由于这个树组件的节点越来越多&#xff0c;导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多&#xff0c;导致的浏览器卡顿&#xff0c;这里很明显就需要用到虚拟列表的技术&…...

android RelativeLayout布局

<?xml version"1.0" encoding"utf-8"?> <RelativeLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_height"match_parent"android:gravity&…...

MFE(微前端) Module Federation:Webpack.config.js文件中每个属性的含义解释

以Module Federation 插件详为例&#xff0c;Webpack.config.js它可能的配置和含义如下&#xff1a; 前言 Module Federation 的Webpack.config.js核心配置包括&#xff1a; name filename&#xff08;定义应用标识&#xff09; remotes&#xff08;引用远程模块&#xff0…...

C++实现分布式网络通信框架RPC(2)——rpc发布端

有了上篇文章的项目的基本知识的了解&#xff0c;现在我们就开始构建项目。 目录 一、构建工程目录 二、本地服务发布成RPC服务 2.1理解RPC发布 2.2实现 三、Mprpc框架的基础类设计 3.1框架的初始化类 MprpcApplication 代码实现 3.2读取配置文件类 MprpcConfig 代码实现…...

解析两阶段提交与三阶段提交的核心差异及MySQL实现方案

引言 在分布式系统的事务处理中&#xff0c;如何保障跨节点数据操作的一致性始终是核心挑战。经典的两阶段提交协议&#xff08;2PC&#xff09;通过准备阶段与提交阶段的协调机制&#xff0c;以同步决策模式确保事务原子性。其改进版本三阶段提交协议&#xff08;3PC&#xf…...

LangChain 中的文档加载器(Loader)与文本切分器(Splitter)详解《二》

&#x1f9e0; LangChain 中 TextSplitter 的使用详解&#xff1a;从基础到进阶&#xff08;附代码&#xff09; 一、前言 在处理大规模文本数据时&#xff0c;特别是在构建知识库或进行大模型训练与推理时&#xff0c;文本切分&#xff08;Text Splitting&#xff09; 是一个…...