[学习笔记]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/False
    os.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_name
    print('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':
            #     continue
            sec.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()  # 将图像显示出来

最后成图

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

CCF_A 计算机视觉顶会CVPR2024投稿指南以及论文模板

目录 CVPR2024官网: CVPR2024投稿链接: CVPR2024 重要时间节点: CVPR2024投稿模板: WORD: LATEX : CVPR2024_AuthorGuidelines CVPR2024投稿Topics: CVPR2024官网: https://cvpr.thecvf.com/Conferences/2024CV…

pytorch复现4_Resnet

ResNet在《Deep Residual Learning for Image Recognition》论文中提出,是在CVPR 2016发表的一种影响深远的网络模型,由何凯明大神团队提出来,在ImageNet的分类比赛上将网络深度直接提高到了152层,前一年夺冠的VGG只有19层。Image…

正点原子嵌入式linux驱动开发——Linux USB驱动

USB是很常用的接口,目前大多数的设备都是USB接口的,比如鼠标、键盘、USB摄像 头等,在实际开发中也常常遇到USB接口的设备,本章就来学习一下如何使能Linux内核自带的USB驱动。这里不会具体学习USB的驱动开发。 USB接口简介 什么是…

常用sql语句

/*表操作*/ drop table order; create table products( product_no integer primary key default 1, name text, price numeric default 9.99 ); create table orders ( order_id integer primary key default 1, product_no int, quantity integer ); create table order_…

目标检测:Proposal-Contrastive Pretraining for Object Detection from Fewer Data

论文作者:Quentin Bouniot,Romaric Audigier,Anglique Loesch,Amaury Habrard 作者单位:Universit Paris-Saclay; Universit Jean Monnet Saint-Etienne; Universitaire de France (IUF) 论文链接:http://arxiv.org/abs/2310.16835v1 内容…

ztree调整节点间距及一般使用

1.基本介绍 树形结构菜单的功能属于非常常见的一种菜单交互,本人先后也使用过多种树形结构的插件,有 ztree、xloadtree、treeview、datagrid-tree 等等等等。近期有个功能恰好又要使用tree菜单了,由于可自行选择使用的组件,所以略…

微信小程序 人工智能志愿者服务活动报名系统uniAPP+vue

基于java语言设计并实现了人工智能志愿者服务APP。该APP基于B/S即所谓浏览器/服务器模式,应用SpringBoot框架与HBuilder X技术,选择MySQL作为后台数据库。系统主要包括用户、志愿活动、活动报名、活动签到、服务职责、服务排行等功能模块。 本文首先介绍…

【2021集创赛】Risc-v杯一等奖:自适应噪声环境的超低功耗语音关键词识别系统

本作品参与极术社区组织的有奖征集|秀出你的集创赛作品风采,免费电子产品等你拿~活动。 团队介绍 参赛单位:东南大学 队伍名称:Hey Siri 指导老师:刘波 参赛队员:钱俊逸、张人元、王梓羽 总决赛奖项:全国一等奖 摘要…

数字孪生技术:金融业合规与自动化的未来

在当今数字化时代,金融行业正积极探索数字孪生技术,以实现更高效的运营和更好的客户体验。数字孪生是一种将实体世界的对象、过程和系统数字化为虚拟模型的技术,金融机构正在充分利用它带来的众多优势。 1. 风险管理与模拟 数字孪生模型可用…

docker部署minio并使用springboot连接

需求:工作中,在微信小程序播放时,返回文件流并不能有效的使用,前端需要一个可以访问的地址,springboot默认是有资源拦截器的,但是不适合生产环境的使用 可以提供使用的有例如fastdfs或者minio,这…

Flutter 05 组件状态、生命周期、数据传递(共享)、Key

一、Android界面渲染流程UI树与FlutterUI树的设计思路对比 二、Widget组件生命周期详解 1、Widget组件生命周期 和其他的视图框架比如android的Activity一样,flutter中的视图Widget也存在生命周期,生命周期的回调函数体现在了State上面。组件State的生命…

QT实现在线流媒体播放平台

文章目录 QT实现在线流媒体播放平台简介开发视频ffmpeg下载SimpleVideoPlayer.hSimpleVideoPlayer.cpp 开发音频添加功能打开文件夹播放暂停播放上下一首选择倍速 效果展示项目下载 QT实现在线流媒体播放平台 简介 Qt是一种流行的C开发框架,它提供了用于构建图形用…

FPGA_Signal TapII 逻辑分析仪 在线信号波形抓取

FPGA_Signal TapII 逻辑分析仪 在线信号波形抓取 由于一些工程的仿真文件不易产生,所以我们可以利用 quartus 软件自带的 SignalTap 工具对波形进行抓取 对各个信号进行分析处理,让电子器件与FPGA进行正常通讯工作,也验证所绘制的波形图是否一…

Scala库用HTTP爬虫IP代码示例

根据提供的引用内容,sttp.client3和sttp.model库是用于HTTP请求和响应处理的Scala库,可以与各种Scala堆栈集成,提供同步和异步,过程和功能接口。这些库可以用于爬虫程序中,用于发送HTTP请求和处理响应。需要注意的是&a…

JavaScript从入门到精通系列第二十七篇:详解JavaScript中的包装类

大神引荐:作者有幸结识技术大神孙哥为好友获益匪浅,现在把孙哥视频分享给大家 孙哥链接:孙哥个人主页 作者简介:一个颜值99分,只比孙哥差一点的程序员 本专栏简介:话不多说,让我们一起干翻JavaS…

vue自定义组件:中线分割拖动盘

在GitHub上可以找到类似的组件,比如4年前发布的vue2版本的 Vue Split Pane, 但是我还是自己写了一个类似的: 组件效果: 特点: 不是照抄别人的。同时支持vue2、vue3(组件内部使用选项式API风格&#xff09…

不一样的网络协议-------KCP协议

1、kcp 的协议特点 1.1、RTO 不翻倍 RTO(Retransmission TimeOut),重传超时时间。tcp x 2,kcp x 1.5,提高传输速度 1.2、选择重传 TCP丢包时会全部重传从该包开始以后的数据,而KCP选择性重传,只重传真正丢失的数据包…

同为科技(TOWE)自动断电倒计时定时桌面PDU插排

在每个家庭中,插排插座都是必不可少的电源设备。随着各种电器的普及应用和生活节奏的加快,人们对插排也有着多样化的需求,比如在插排中加入定时开关、自动断电、断电记忆、倒计时等等功能,让原本不支持智能家居的用电器秒变智能。…

DL4J无法下载MNIST数据集解决 Server returned HTTP response code: 403 for URL解决方法

报错情况 报错如下: 16:45:41.463 [main] INFO org.nd4j.nativeblas.Nd4jBlas - Number of threads used for OpenMP BLAS: 6 16:45:41.497 [main] INFO org.nd4j.linalg.api.ops.executioner.DefaultOpExecutioner - Backend used: [CPU]; OS: [Windows 10] 16:4…

Android 驱动学习调试

1 Android 驱动代码编译 参考https://www.sharetechnote.com/html/Linux_DeviceDriver_Programing.html#Device_Driver_HelloWorld编译ko文件调试驱动代码&#xff0c;将ko文件push到手机上验证 相关C文件testdriver.c #include <linux/init.h> #include <linux/mod…