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

news2025/2/22 23:58:23

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.coloradmin.cn/o/1537307.html

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

相关文章

2024阿里云服务器99计划优惠活动_开年采购季优惠价格表

2024阿里云开年采购活动3月优惠&#xff0c;99计划云服务器99元一年、免费领取上云扶持优惠券&#xff0c;不只是云服务器、云数据库、存储、云电脑、域名等均有活动&#xff0c;阿里云服务器网aliyunfuwuqi.com整理阿里云开年采购上云无忧活动入口、优惠价格表和优惠券领取详细…

【Linux】信号的处理{信号处理的时机/了解寄存器/内核态与用户态/信号操作函数}

文章目录 0.对于信号捕捉的理解1.信号处理的时机1.1 何时处理信号&#xff1f;1.2 内核态和用户态1.3 内核态和用户态的切换 2.了解寄存器3.信号捕捉的原理4.信号操作函数4.1sighandler_t signal(int signum, sighandler_t handler);4.2int sigaction(int signum, const struct…

代码随想录算法训练营第三十一天 | 455. 分发饼干、376. 摆动序列、53. 最大子数组和

代码随想录算法训练营第三十一天 | 455. 分发饼干、376. 摆动序列、53. 最大子数组和 455. 分发饼干题目解法 376. 摆动序列题目解法 53. 最大子数组和题目解法 感悟 455. 分发饼干 题目 解法 class Solution { public:int findContentChildren(vector<int>& g, vec…

大模型时代,5个最顶级的向量数据库

介绍5个向量数据库。 大模型时代&#xff0c;向量数据库彻底的火了&#xff0c;今天我分享业内最频繁使用的向量数据库&#xff0c;更多实践经验&#xff0c;可以文末参加我们的技术落地的讨论&#xff0c;喜欢本文记得收藏、关注、点赞。 1 Chroma 使用ChromaDB构建LLM应用程…

D咖:颠覆传统,重塑无人自助饮品机新篇章

在当今的快节奏社会中&#xff0c;智能科技正在以前所未有的速度渗透到生活的各个方面&#xff0c;从智能手机到智能家居&#xff0c;它们不仅极大地提高了我们的生活效率&#xff0c;也在不断地改善和丰富我们的生活体验。而饮品行业&#xff0c;作为人们日常生活中不可或缺的…

TCP协议的粘包问题解决方式

粘包问题 首先说明一点&#xff0c;TCP有粘包问题&#xff0c;UDP没有粘包问题。 发送端可以是1KB地发送数据&#xff0c;而接收端的应用程序可以2KB地提走数据&#xff0c;当然也有可能一次提走3K或6K数据&#xff0c;或者一次只提走几个字节的数据&#xff0c;也就是说&…

VS Code 跳板机登录服务器(手打密码+秘钥登录)

目录 0.为什么要用跳班机登陆服务器&#xff1f; 1.VS Code插件安装及ssh安装 2.密码链接方式 1&#xff09;添加ssh设置&#xff0c;设置主机 2)设置跳板机 Tips:可以直接通过窗口连接文件管理 3.密钥连接方式&#xff08;更安全更方便&#xff09; 1&#xff09;mac版…

常见优化器对比:梯度下降法、带动量的梯度下降法、Adagrad、RMSProp、Adam

系列文章目录 李沐《动手学深度学习》线性神经网络 线性回归 李沐《动手学深度学习》优化算法&#xff08;相关概念、梯度下降法、牛顿法&#xff09; 李沐《动手学深度学习》优化算法&#xff08;经典优化算法&#xff09; 文章目录 系列文章目录一、梯度下降法&#xff08;一…

java 泛型(下)

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

Transformer学习【从零理解】

Transformer 一、整体框架 二、Encoder 1.输入部分: &#xff08;1&#xff09;Embedding&#xff1a;将输入的词转换为对应的词向量。 &#xff08;2&#xff09;位置编码&#xff1a;因为保证输出时&#xff0c;顺序不会打乱&#xff0c;所以要加入时序信息即位置编码。 公…

Linux:权限的概念与理解

目录 1. Linux权限的概念 2. Linux权限管理 01.文件访问者的分类 02.文件类型和访问权限 03.文件权限值的表示方法 04. 文件访问权限的相关设置方法 3. 使用 sudo分配权限 4. 目录的权限 ---------- 权限 用户角色(具体的人) 文件权限属性 ---------- 1. Linux权限的…

JavaScrpt学习笔记_一

一、Js编写位置 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title> <!-- 可以将js代码编写到外部js文件中&#xff0c;然后通过script标签引入写到外部文件中可以在不同页面中…

乐得瑞科技PD协议芯片:OTG与充电并行,引领数据交互

在科技日新月异的今天&#xff0c;数据交互的方式对于我们的日常生活和工作都起到了至关重要的作用。但在OTG技术诞生之前&#xff0c;这一过程却显得相当繁琐和耗时。想象一下&#xff0c;你需要将数码相机的照片导入到笔记本电脑中&#xff0c;却不得不频繁地拔出内存卡&…

Java毕业设计-基于springboot开发的网吧管理系统-毕业论文+答辩PPT(附源代码+演示视频)

文章目录 前言一、毕设成果演示&#xff08;源代码在文末&#xff09;二、毕设摘要展示1、开发说明2、需求分析3、系统功能结构 三、系统实现展示1、系统登录2、管理员功能模块3、网管功能模块4、会员功能模块 四、毕设内容和源代码获取总结 Java毕业设计-基于springboot开发的…

【Qt】使用Qt实现Web服务器(六):QtWebApp用户名密码登录

1、示例 1)演示 2)登录 3)显示 2、源码 示例源码Demo1->LoginController void LoginController::service(HttpRequest& request, HttpResponse& response) {

基于Springboot的西安旅游系统(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的西安旅游系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&…

基于Springboot+Vue的前后端分离的简单Demo案例(二)

前端搭建 Vue router 来动态构建左侧菜单 导航1 页面1页面2导航2 页面3页面4导航3 页面5页面6 在views目录下创建四个页面 PageOne.vue <template><h1>这是页面1</h1> </template> <script> export default {name: "PageOne", }; …

mysql字段多个值,mybatis/mybatis-plus匹配查询

mysql中有一个字段是字符串类型的&#xff0c;category字段值有多个用逗号分割的&#xff0c;例如&#xff1a;娱乐,时尚美妆,美食 。现在想实现这么一个功能&#xff0c; 前端传参 字符串&#xff0c;美食,娱乐。现在想在mybatis的xml中实现&#xff0c;查询&#xff0c;能查到…

GPU算力池管理工具Determined AI部署与使用教程(2024.03)

1. 概念 1.1 什么是Determined&#xff1f; Determined AI 是一个全功能的深度学习平台&#xff0c;兼容 PyTorch 和 TensorFlow。它主要负责以下几个方面&#xff1a; 分布式训练&#xff1a;Determined AI 可以将训练工作负载分布在多个 GPU&#xff08;可能在多台计算机上…

【NLP】从变形金刚到Transfomer 01

Transformer是一种非常强大的模型&#xff0c;在自然语言处理&#xff08;NLP&#xff09;领域里引起了一场革命。 "从变形金刚到技术革命家&#xff0c;Transformer不再仅是儿时屏幕上的英雄。&#x1f916;✨ 在今天的AI领域&#xff0c;它变身成为自然语言处理的超级英…