【pcolor数据可视化】Matlab vs. Python

1、Matlab代码及结果

  • 代码
clear;clc
load('.\nclcolormap.mat')

sl = [0,50,100,200,500,0];
el = [50,100,200,500,1000,200];

for i = 1:length(sl)
    
    file = ['..\data\static_result\VIS_Min-',num2str(sl(i)),'to',num2str(el(i)),'_yearly.npy'];
    data = readNPY(file);
    mask=readNPY('.\mask.npy');
    data =data.*mask;
    siz = 30;
    
    lat = 15:0.05:55;
    lon = 70:0.05:140.05;
    [X,Y] = meshgrid(lon,lat);
    
    set(gcf,'color',[1 1 1],'position',[10 45 1000 800*1.2]);%get(0,'screensize')
    axes('position',[0.1 0.2 0.85 0.6]);
    
    % 数据映射: 数据分布差异较大,使用分位数将数据进行映射
    datax = data(:);
    datax(isnan(datax))=[];
    percentiles = prctile(datax(:), [0,50,80,90:2:98 99.9]);
    percentiles = unique(percentiles);
    x_ = linspace(percentiles(end-1), percentiles(end), 4);
    percentiles = [percentiles(1:end-2), x_];
    percentiles = unique(percentiles);
    xx1=percentiles(1:end-1);
    xx2=percentiles(2:end);
    CC1=0;CC2=length(xx1);
    data_map=data;
    for ii=1:length(xx1)
        data_map(data>=xx1(ii)&data<xx2(ii))=ii-0.5;
    end
    
    % 画图
    mypcolor(X,Y,data_map);shading interp
    hcb=colorbar;
    map = nclcolormap.WhBlGrYeRe;
    map_ = map(round(linspace(1, length(map), CC2)),:);
    colormap(map_)
    box on;hold on
    caxis([CC1 CC2]);
    set(hcb,'xtick',[CC1:CC2],'xticklabel',num2str(percentiles','%.1f'),'FontName','Times New Roman','fontsize',siz-15)
    set(hcb,'Location', 'southoutside','position',[0.1000 0.0903 0.8500 0.0278])
    set(get(hcb,'xlabel'),'string','\fontname{Aril}频次','fontsize',siz-10);
    % 地理信息
    path = '.\China\';
    China1=shaperead([path,'省.shp']);
    China2=shaperead([path,'九段线.shp']);
    plot([China1(:).X],[China1(:).Y],'color',[0.8 0.8 0.8],'linewidth',1); hold on
    plot([China2(:).X],[China2(:).Y],'color',[0.8 0.8 0.8],'linewidth',1); hold on
    axis([70 140 15 55]);hold on
    set(gca,'fontsize',siz-15,'fontname','Times New Roman',...
        'tickdir','out','ticklength',[0.01,0.05],'linewidth',1.2);
    xlabel('Lon(\circE)', 'fontsize',siz-12,'fontweight','bold')
    ylabel('Lat(\circN)', 'fontsize',siz-12,'fontweight','bold')
    title(['\fontname{Aril}2019-2023年平均',num2str(sl(i)),'-',num2str(el(i)),'m能见度频次'],'fontsize',siz-12,'fontweight','bold');
    % 小地图
    ax2=axes('position', [0.81 0.21 0.12 0.12]);
    mypcolor(X,Y,data_map);shading interp
    caxis([CC1 CC2]);
    colormap(map_)
    box on;hold on
    plot([China1(:).X],[China1(:).Y],'color',[0.7 0.7 0.7],'linewidth',0.5); hold on
    plot([China2(:).X],[China2(:).Y],'color',[0.7 0.7 0.7],'linewidth',0.5); hold on
    axis([104.5, 124, 0, 26]);
    set(gca,'xtick','','ytick','','layer','top');
    
    save_name=['../map/matlab_map/',num2str(sl(i)),'-',num2str(el(i)),'.png'];
    export_fig(save_name,'-r200');
    clf
end
close all
  • 结果
    在这里插入图片描述

2、Python代码及结果

  • 代码
import os
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.colors as mcolors
import matplotlib as mpl

import cartopy.crs as ccrs
import cartopy.io.shapereader as shpreader
from mpl_toolkits.axes_grid1.inset_locator import inset_axes
from matplotlib.colors import LinearSegmentedColormap

import regionmask
import geopandas as gpd
import warnings

warnings.filterwarnings("ignore")
import matplotlib.ticker as ticker


def map_frequency(condition = [0, 50], season = None):
    # the mask of Chinese Region: 中国区域的mask
    file = './china2.shp'
    countries = gpd.read_file(file)
    deg = 0.05
    lat = np.arange(15, 55 + deg, deg)
    lon = np.arange(70, 140 + deg, deg)
    X, Y = np.meshgrid(lon, lat)
    mask = regionmask.mask_geopandas(countries, lon, lat).to_numpy()
    mask[~np.isnan(mask)] = 1

    # colormap: 将两个colormap进行拼接
    cmap_jet = plt.cm.jet
    cmap_gray = plt.cm.gray
    gray = cmap_gray(np.linspace(0, 1, 9))
    colors = np.vstack((gray[8], cmap_jet(np.linspace(0, 1, 9))))

    # load data
    if season is None:
        file = f'../data/static_result/VIS_Min-{condition[0]}to{condition[1]}_yearly.npy'
    else:
        file = f'../data/static_result/VIS_Min{condition[0]}to{condition[1]}_yearly_{season}.npy'

    factor_dict = {'spring': 92, 'summer': 92, 'autumn': 91, 'winter': 90}
    factor = factor_dict.get(season, 365)
    data = np.load(file, allow_pickle=True)

    # plot map: 画地图
    plt.rcParams['font.family'] = ['Microsoft YaHei']
    extents = [70, 140, 15, 55]
    crs = ccrs.PlateCarree()
    fig = plt.figure(figsize=(12, 6))
    ax = fig.add_subplot(111, projection=crs)
    ax.set_extent(extents, crs)

    prov_reader = shpreader.Reader(r'.\bou2_4p.shp')
    nineline_reader = shpreader.Reader(r'.\九段线.shp')

    ax.add_geometries(prov_reader.geometries(), crs, edgecolor='gray', facecolor='none', lw=1)
    ax.add_geometries(nineline_reader.geometries(), crs, edgecolor='gray', facecolor='none', lw=1)

    ax.set_xticks(np.arange(extents[0], extents[1] + 5, 10))
    ax.set_yticks(np.arange(extents[2], extents[3] + 5, 10))
    plt.tick_params(axis='both', which='major', labelsize=18)

    # 数据分布差异较大,使用分位数对数据进行映射
    data = data * mask
    Low_VIS = data.copy()
    datax = data[~np.isnan(data)]
    level = np.unique((np.percentile(datax, np.array([0, 50, 80] + list(range(90, 99, 2)) + [99.9]))))
    if len(level) >=2:
        x_ = np.linspace(level[-2], level[-1], 4)
    else:
        x_ = np.linspace(0, 1, 4)
    level = np.unique(np.concatenate((level[:-2],x_)))
    xx1 = level[:-1]
    xx2 = level[1:]
    CC1 = 0
    CC2 = len(xx1)

    for jj in range(CC2):
        data[np.where((Low_VIS >= xx1[jj]) & (Low_VIS < xx2[jj]))] = jj + 0.5
	
	# 叠加数据层
    norm = mcolors.Normalize(vmin=0, vmax=len(level) - 1)
    cmaps = LinearSegmentedColormap.from_list('Combined', colors, N=len(level) - 1)
    map = ax.pcolormesh(X, Y, data * mask, cmap=cmaps, vmin=CC1, vmax=CC2)

    title_dict = {'spring': '春季', 'summer': '夏季', 'autumn': '秋季', 'winter': '冬季'}
    title_str = title_dict.get(season, '')
    plt.title('2019—2023年{}平均 {}-{}m能见度频次'.format(title_str, condition[0], condition[1]), fontsize=20, pad=10)
    plt.xlabel('Lon(°E)', fontsize=18)
    plt.ylabel('Lat(°N)', fontsize=18)

    # 调整colorbar与图像等高
    cb_ax = inset_axes(ax, width="3%", height="100%", loc='lower left', bbox_to_anchor=(1.01, 0., 1, 1),bbox_transform=ax.transAxes, borderpad=0)
    cbar = plt.colorbar(mpl.cm.ScalarMappable(norm=norm, cmap=cmaps), cax=cb_ax, ax=map)
    cbar.ax.set_title('频次', size=18, fontname='SimHei', pad=10)
    cbar.ax.tick_params(labelsize=15)
    tick_locs = list(range(len(level)))
    tick_labels = np.unique(np.round(level,1)).astype(str)
    cbar.locator = ticker.FixedLocator(tick_locs)
    cbar.formatter = ticker.FixedFormatter(tick_labels)
    cbar.update_ticks()
	
	# 南海小地图
    ax2 = fig.add_axes([0.74, 0.13, 0.1, 0.25], projection=crs)
    ax2.set_extent([104.5, 124, 0, 26], crs=ccrs.PlateCarree())
    ax2.add_geometries(prov_reader.geometries(), crs, edgecolor='gray', facecolor='none', lw=1)
    ax2.add_geometries(nineline_reader.geometries(), crs, edgecolor='gray', facecolor='none', lw=1)
    ax2.pcolormesh(X, Y, data * mask, cmap=cmaps, vmin=CC1, vmax=CC2)

    prov_reader.close()
    nineline_reader.close()

    save_path = '../map/interp_map'
    if not os.path.exists(save_path):
        os.makedirs(save_path)

    if season is None:
        save_name = f'{condition[0]}-{condition[1]}.png'
    else:
        save_name = f'{condition[0]}-{condition[1]}-{season}.png'
    save_file = os.path.join(save_path, save_name)

    plt.savefig(save_file, bbox_inches='tight', dpi=300)


if __name__ == '__main__':
    conditions = [[0, 50], [50, 100], [100, 200], [200, 500], [500, 1000], [0, 200]]
    for condition in conditions:
        # 年平均频次
        map_frequency(condition)
        # 分季节频次
        for season in ['spring', 'summer', 'autumn', 'winter']:
            map_frequency(condition, season)
  • 结果
    在这里插入图片描述

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

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

相关文章

基于springboot的mysql实现读写分离

前言: 首先思考一个问题:在高并发的场景中,关于数据库都有哪些优化的手段&#xff1f;常用的有以下的实现方法:读写分离、加缓存、主从架构集群、分库分表等&#xff0c;在互联网应用中,大部分都是读多写少的场景,设置两个库,主库和读库,主库的职能是负责写,从库主要是负责读…

FloodFill算法——图像渲染

文章目录 题目解析题目内容解读 算法解析代码解析 题目解析 首先我们先来看看题目&#xff1a;图像渲染 题目内容解读 我们来解读一下题目内容这个题目的意思其实就是有一个如下图所示的二维矩阵 这个题目的意思在这类题目中也是非常标准的&#xff0c;就是给我们一个二维数…

yaml 语法和在线解析工具

文章目录 在线解析工具1. 简介2. 语法规则3. 数据类型3.1 数组&#xff1a;3.2对象&#xff1a;3.3 标量3.4 复合结构3.5 锚点3.5.1 单个锚点3.5.6 多个锚点 3.6 引号 参考 在线解析工具 工具1 工具2 1. 简介 Yaml是一种可读性高的数据标记语言&#xff0c;Yaml文件是一种配…

python基础知识(三)基本编程题,应用题

基本编程题 1.从键盘输入一个整数和一个字符&#xff0c;以逗号隔开&#xff0c;在屏慕上显示输出一条信息。 示例如下: 输入&#xff1a; 10, 输出&#xff1a; 10 s input("请输入一个整数和一个字符&#xff0c;用逗号隔开&#xff1a;")l s.split(",&q…

使用vscode调试代码

Step1&#xff1a;在系统中安装gdb 在Ubuntu系统下安装gdb&#xff1a; apt-get update apt-get install gdb 在CentOS系统下安装gdb&#xff1a; yum install gdb Step2&#xff1a;编译生成Debug版本的可执行程序 假设源文件名称为test.cpp&#xff0c;使用g编译器&#…

你不知道的console

console console 对象提供了浏览器控制台调试的接口&#xff0c;我们可以从任何全局对象中访问到它&#xff0c;在不同浏览器上它的工作方式可能不一样&#xff0c;但通常都会提供一套共性的功能。 1.console.log() 打印内容的通用方法&#xff0c;使用方法可以参考使用字符…

DBO优化LSBoost回归预测(matlab代码)

DBO-LSBoost回归预测matlab代码 蜣螂优化算法(Dung Beetle Optimizer, DBO)是一种新型的群智能优化算法&#xff0c;在2022年底提出&#xff0c;主要是受蜣螂的的滚球、跳舞、觅食、偷窃和繁殖行为的启发。 数据为Excel股票预测数据。 数据集划分为训练集、验证集、测试集,比…

【系统架构师】-计算机网络

1、网络的划分 网络性能指标&#xff1a;速率、带宽(频带宽度或传送线路速率)、吞吐量、时延、往返时间、利用率。 网络非性能指标&#xff1a;费用、质量、标准化、可靠性、可扩展性、可升级性、易管理性和可维护性。 总线型(利用率低、干扰大、价格低)、 星型(交换机转发形…

【Linux】系统开启和关闭过程

Linux 系统启动过程 BIOS 自检&#xff1a;在计算机开机时&#xff0c;BIOS 会进行自检&#xff0c;检查硬件设备是否正常。 加载引导程序&#xff1a;BIOS 自检完成后&#xff0c;会加载引导程序&#xff0c;如 GRUB、LILO 等。引导程序会加载内核和初始化 RAM 磁盘&#xff…

数据结构:详解【栈和队列】的实现

目录 1. 栈1.1 栈的概念及结构1.2 栈的实现1.3 栈的功能1.4 栈的功能的实现1.5 完整代码 2. 队列2.1 队列的概念及结构2.2 队列的实现2.3 队列的功能2.4 队列的功能的实现2.5 完整代码 1. 栈 1.1 栈的概念及结构 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的…

如何看待腾讯 QQ 浏览器抄袭 Arc

今天在 Reddit 的帖子上看到&#xff0c;QQ 浏览器抄袭了 Arc 而且还是 Arc 官方发布的 It looks very similar lol 看起来也太像了&#xff0c;笑死我了 稍微震惊了一下&#xff0c;带着疑惑&#xff0c;打开了 QQ 浏览器官网页 点击下载 ⬇️ 下载后打开 翻找了下&#xff0…

2004-2022年各省化学需氧量数据(无缺失)

2004-2022年各省化学需氧量数据&#xff08;无缺失&#xff09; 1、2004-2022年 2、范围&#xff1a;31省 3、指标&#xff1a;化学需氧量 4、来源&#xff1a;各省年鉴、国家统计局、环境年鉴 5、指标解释&#xff1a;化学需氧量(COD)排放量指工业废水中COD排放量与生活污…

java 泛型(下)

本篇文章主要说明的是类型通配符、可变参数、可变参数的使用等。 在学习之前&#xff0c;希望能对泛型有个大概了解&#xff0c;可参考链接 java 泛型&#xff08;上&#xff09;-CSDN博客 也希望对泛型类、泛型接口、泛型方法有个大概的认识及使用&#xff0c;可参考链接 j…

【保姆级教程】YOLOv8_Track多目标跟踪,快速运行

一、YOLOV8环境准备 1.1 下载安装最新的YOLOv8代码 仓库地址&#xff1a; https://github.com/ultralytics/ultralytics1.2 配置环境 pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple二、下载测试视频&#xff0c;预训练权重 测试视频 链接&am…

nuc980下 RTL8188EUS_wifi移植过程

我使用的nuc980型号为NUC980DK61YC&#xff0c;内核版本为"linux 4.4.115" &#xff0c;以下过程是在自己单片机上移植的过程&#xff0c;仅供参考&#xff0c;不同配置环境可能会有不同的坑需要踩&#xff0c;希望会对各位小伙伴有帮助。 1.驱动添加与调整 注意&a…

[综述笔记]A Survey on Deep Learning for Neuroimaging-Based Brain Disorder Analysis

论文网址&#xff1a;Frontiers | A Survey on Deep Learning for Neuroimaging-Based Brain Disorder Analysis (frontiersin.org) 英文是纯手打的&#xff01;论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误&#xff0c;若有发现欢迎评论…

NET 自定义控件

如果添加 Category&#xff0c; 自定义控件&#xff0c;会放在杂项中

03-Java面试题八股文-----java基础——10题

41、HashMap 的长度为什么是 2 的 N 次方呢&#xff1f; 为了能让 HashMap 存数据和取数据的效率高&#xff0c;尽可能地减少 hash 值的碰撞&#xff0c;也就是说尽量把数据能均匀的分配&#xff0c;每个链表或者红黑树长度尽量相等。 我们首先可能会想到 % 取模的操作来实现。…

6 修改主机名和HOSTS文件

后期我们会配置多台服务器&#xff0c;那么每台服务器我们都会给定一个主机名&#xff0c;方便后期通过主机名进行访问。主机名的修改我们可以在安装操作系统时对其修改&#xff0c;如果忘记了&#xff0c;就可以修改配置文件完成&#xff0c;像后期我们进行虚拟机克隆后&#…

Unity Toggle与Toggle Group的妙用

Toggle与Toggle Group结合使用&#xff0c;妙处多多。 因为在同一Toggle Group内只有一个Toggle可以被选中&#xff0c;那么对于我们要创建单选按钮组、游戏的一些开关、暗夜模式、筛选不同显示内容等功能都非常好用。 比如我要实现通过点击不同按钮,从而筛选显示不同内容&am…