python在使用basemap进行绘图时进行重采样

python在使用basemap进行绘图时进行重采样

以伪彩色图为例

'''生成绘图数据,这里随机生成114X94网格大小的矩阵'''
import numpy as np
data_num=np.random.rand(114,94)

'''导入basemap包和matplotlib包'''
from mpl_toolkits.basemap import Basemap
import matplotlib.pyplot as plt

'''设置地图投影方式,高分辨率,经纬度范围等'''
map = Basemap(projection='merc', lat_0=0,resolution='h',
              llcrnrlon=104.875, 
              llcrnrlat=13.875, 
              urcrnrlon=128.125, 
              urcrnrlat=42.125)
              
'''生成一张画布'''
fig=plt.figure(figsize=(9, 3))

'''根据经纬度范围,通过设置经纬度间隔,设置原始分辨率(lons和lats与data_num行与列大小相同)'''
lons = np.linspace(104.875, 128.125,94)
lats = np.linspace(13.875, 42.125, 114)

'''绘制原始分辨率图像,位于画布左边二分之一处'''
ax = fig.add_subplot(121)

'''设置原始分辨率图像题'''
ax.set_title('Without transform_scalar')

'''将原始经纬度网格化'''
llons, llats = np.meshgrid(lons, lats)

'''将网格化的经纬度转换为投影坐标'''
x, y = map(llons, llats)

'''绘制原始分辨率的伪彩色图'''
map.pcolormesh(x, y, data_num,cmap='coolwarm', zorder=1)

'''绘制海岸线,线粗为 1'''
map.drawcoastlines(linewidth=1)

'''绘制经纬度坐标,这里使用set_lonlat函数,函数代码文章末尾另附'''

set_lonlat(map, range(0, 180, 4), range(0, 90, 4), [0, 0, 1, 0], [1,0 , 0, 0], 12)

'''绘制颜色条'''
map.colorbar()


'''绘制重采样分辨率图像,位于画布右边二分之一处'''
ax = fig.add_subplot(122)

'''设置重采样分辨率图像图题'''
ax.set_title('Applying transform_scalar')

'''生成重采样数据data_interp、重采样经纬度网格x,y;
重采样分辨率为提升原始分辨率的25倍,这里将原始网格大小的行和列乘以25
(如果是降低原始分辨率的25倍,则除以25)'''
data_interp, x, y = map.transform_scalar(data_num, lons, lats, 114*25, 94*25, returnxy=True)

'''绘制重采样后的伪彩色图'''
map.pcolormesh(x, y, data_interp,cmap='coolwarm', zorder=1)

'''绘制海岸线,线粗为 1'''
map.drawcoastlines(linewidth=1)

'''绘制经纬度坐标'''
set_lonlat(map, range(0, 180, 4), range(0, 90, 4), [0, 0, 1, 0], [1,0 , 0, 0], 12)

'''绘制颜色条'''
map.colorbar()

'''显示图像'''
plt.show

结果展示
在这里插入图片描述

set_lonlat函数

def set_lonlat(_m, lon_list, lat_list, lon_labels, lat_labels, lonlat_size):
    """
    为Basemap实例画带tick标的经纬度注释
    自带画水平线和竖直线标注方式不带刻度标
    当然函数仍调用了自带标注函数只是在此基础上加了tick标
    :param _m: Basemap实例
    :param lon_list: 经度 详见Basemap.drawmeridians函数介绍
    :param lat_list: 纬度 同上
    :param lon_labels: 标注位置 [左, 右, 上, 下] bool值 默认只标注左上待完善 可使用twinx和twiny实现
    :param lat_labels: 同上
    :param lonlat_size: 字体大小
    :return:
    """
    lon_dict = _m.drawmeridians(lon_list, labels=lon_labels, color='none', fontsize=lonlat_size)
    lat_dict = _m.drawparallels(lat_list, labels=lat_labels, color='none', fontsize=lonlat_size)
    lon_list = []
    lat_list = []
    for lon_key in lon_dict.keys():
        try:
            lon_list.append(lon_dict[lon_key][1][0].get_position()[0])
        except:
            continue

    for lat_key in lat_dict.keys():
        try:
            lat_list.append(lat_dict[lat_key][1][0].get_position()[1])
        except:
            continue
    ax = plt.gca()
    ax.xaxis.tick_top()
    ax.set_yticks(lat_list)
    ax.set_xticks(lon_list)
    
    
    ax.tick_params(labelcolor='none')

https://basemaptutorial.readthedocs.io/en/latest/index.html
https://blog.csdn.net/weixin_44092702/article/details/99690821

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值