python

气象绘图(一)-cartopy入门

2020-10-14  本文已影响0人  Van_bcbc

概念引入

Axes/Subplot概念:

Axes/Subplot与Figure的关系

Axes/Subplot的异同:

共同点:两者都相当于画布figure上的画纸ax,概念上是相同的。

不同点:两者在创建画纸ax上略有不同。

Axes创建方式:

plt.axes(rect,projection=None,polar=False,**kwargs)

Parameters:
rect : None or 列表 = [left, bottom, width, height],取值范围为0到1
projection : 投影类型

分别使用subplot和axes创建子图

示例一,使用add_subplot()方法
1)导包

import numpy as np
import matplotlib.pyplot as plt

2)创建示例数据

# 创建示例数据
x = np.arange(1, 10, 0.1)  # start = 1, end = 10, step = 0.1
y1 = np.sin(x)
y2 = np.cos(x)

3)使用add_subplot()方法创建子图

fig = plt.figure(figsize=(16, 9))  # 创建一个画布

ax1 = fig.add_subplot(211)  # 创建子图1
ax1.plot(x, y1, 'r', linestyle='--')

ax2 = fig.add_subplot(212)  # 创建子图2
ax2.plot(x, y2, 'b', linestyle='-.')
add_subplot()方法创建的子图.png

示例二,使用subplot()方法创建子图

plt.figure(figsize=(16, 9))  # 创建一个画布

# 使用subplot创建
plt.subplot(211)
plt.plot(x, y1, 'r', linestyle='--')

plt.subplot(212)
plt.plot(x, y2, 'b', linestyle='-.')

或:

plt.figure(figsize=(16, 9))  # 创建一个画布

# 使用subplot创建
ax1 = plt.subplot(211)
ax1.plot(x, y1, 'r', linestyle='--')

ax2 = plt.subplot(212)
ax2.plot(x, y2, 'b', linestyle='-.')
使用subplot()方法创建的子图.png

示例三,使用add_axes()方法创建子图

# 创建示例数据
x = np.arange(1, 10, 0.1)  # start = 1, end = 10, step = 0.1
y1 = 1 / x
y2 = np.cos(x)


# ------------------画图------------------

fig = plt.figure(figsize=(16, 9))  # 创建一个画布

ax1 = fig.add_axes([0.1, 0.1, 0.6, 0.75])
ax1.plot(x, y1, 'b', linestyle='-.')

ax2 = fig.add_axes([0.38, 0.5, 0.3, 0.3])
ax2.plot(x, y2, 'r', linestyle='--')

示例四,使用axes()方法创建子图

plt.figure(figsize=(16, 9))  # 创建一个画布

ax1 = plt.axes([0.1, 0.1, 0.6, 0.75])
ax1.plot(x, y1, 'b', linestyle='-.')

ax2 = plt.axes([0.38, 0.5, 0.3, 0.3])
ax2.plot(x, y2, 'r', linestyle='--')
使用axes()方法创建.png

非规则拼图

# 非规则拼图
fig = plt.figure(figsize=(16, 9))  # 创建一个画布
ax1 = fig.add_subplot(221)  # 创建子图1
ax2 = fig.add_subplot(222)  # 创建子图2
ax3 = fig.add_subplot(212)  # 创建子图3

ax1.plot(x, np.sin(x), 'r', linestyle='-.')
ax2.plot(x, np.cos(x), 'b', linestyle='--')
ax3.plot(x, np.log(x), 'g', )
非规则拼图1.png

# 非规则拼图
fig = plt.figure(figsize=(16, 9))  # 创建一个画布
ax1 = fig.add_subplot(221)  # 创建子图1
ax2 = fig.add_subplot(223)  # 创建子图2
ax3 = fig.add_subplot(122)  # 创建子图3

ax1.plot(x, np.sin(x), 'r', linestyle='-.')
ax2.plot(x, np.cos(x), 'b', linestyle='--')
ax3.plot(x, np.log(x), 'g', )
非规则拼图2.png

画你的第一张地图

四种投影:

等经纬度投影(PlateCarree)(默认)、兰伯特投影(Lambert)、墨卡托投影(Mercator)、极射赤面投影

class cartopy.crs.Projection,定义投影类

1)等经纬度投影

class cartopy.crs.PlateCarree(central_longitude=0.0, globe=None)

Parameters:

central_longitude:中心经度

2)兰伯特投影

class cartopy.crs.LambertConformal(central_longitude=-96.0, central_latitude=39.0, false_easting=0.0, false_northing=0.0, secant_latitudes=None, standard_parallels=None, globe=None, cutoff=-30)
3)墨卡托投影

class cartopy.crs.Mercator(central_longitude=0.0, min_latitude=-80.0, max_latitude=84.0, globe=None, latitude_true_scale=0.0)

4)极射赤面投影

class cartopy.crs.Stereographic(central_latitude=0.0, central_longitude=0.0, false_easting=0.0, false_northing=0.0, true_scale_latitude=None, globe=None)

在上述基础知识铺垫后,你就可以画你的第一张地图了!让我们先画一张世界地图吧!

1)导入本次画图所需要的包

import matplotlib.pyplot as plt
import cartopy.crs as ccrs

2)画一张世界地图

fig = plt.figure(figsize=(16, 8))  # 设置画布

proj = ccrs.PlateCarree()  # 创建一个投影
ax = plt.axes(projection=proj)  # 创建一个画纸, 并指明投影类型
ax.coastlines()  # 画海岸线
plt.show()  # 显示图像
世界地图.png

在上述代码中,你就画出了第一张地图,但是这张图还明显缺少刻度信息,在下面的代码中将添加坐标信息。
(部分语句参考链接:https://matplotlib.org/3.3.2/api/ticker_api.html)
1)导包

import numpy as np
import matplotlib.pyplot as plt
import cartopy.crs as ccrs
from cartopy.mpl.ticker import LongitudeFormatter, LatitudeFormatter  # 刻度格式
import matplotlib.ticker as mticker  # 添加网格线

2)画图

fig = plt.figure(figsize=(16, 8))  # 设置画布

proj = ccrs.PlateCarree()  # 创建一个投影
ax = plt.axes(projection=proj)  # 创建一个画纸, 并指明投影类型
ax.coastlines()  # 画海岸线


# 设置范围
extent = [-180, 180, -90, 90]

# 设置刻度
dx = 60
dy = 30
offset = min(dx, dy)

xticks = np.arange(extent[0], extent[1] + offset, dx)  # 创建x轴刻度
yticks = np.arange(extent[2], extent[3] + offset, dy)  # 创建y轴刻度


# 添加刻度
ax.set_xticks(xticks, crs=ccrs.PlateCarree())  
ax.set_yticks(yticks, crs=ccrs.PlateCarree()) 

# 设置刻度字体大小

# 方法一
# ax.tick_params(axis='x', labelsize=15) 
ax.tick_params(labelsize=15) 

# 方法二
# plt.xticks(fontsize = 15)
# plt.yticks(fontsize = 15)

# 设置刻度格式为经纬度格式
ax.xaxis.set_major_formatter(LongitudeFormatter(zero_direction_label=True))  
ax.yaxis.set_major_formatter(LatitudeFormatter())

# 设置画图范围
ax.set_extent(extent)

# 添加网格线
# gl = ax.gridlines(crs=proj, draw_labels=False, linewidth=1, linestyle=':', color='k', alpha=0.8)
# gl.xlocator = mticker.FixedLocator(xticks)  # 设置
# gl.ylocator = mticker.FixedLocator(yticks)
添加坐标后的第一张地图.png

将刻度设置封装为函数方便调用

# # 函数封装,方便调用

def add_geo_ticks(ax, proj, extent, lat_span = 5, lon_span = 5):
    '''
        在图中添加刻度信息
        
        Version 1.0
    
    '''

    from cartopy.mpl.ticker import LongitudeFormatter, LatitudeFormatter  # 刻度格式

    
    offset = min(lon_span, lat_span)

    xticks = np.arange(extent[0], extent[1] + offset, lon_span)  # 创建x轴刻度
    yticks = np.arange(extent[2], extent[3] + offset, lat_span)  # 创建y轴刻度
    
    # 添加刻度
    ax.set_xticks(xticks, crs=proj)  
    ax.set_yticks(yticks, crs=proj) 
    
    # 设置刻度格式为经纬度格式
    ax.xaxis.set_major_formatter(LongitudeFormatter(zero_direction_label=True))  
    ax.yaxis.set_major_formatter(LatitudeFormatter())

    # 设置画图范围
    ax.set_extent(extent)

上述代码变为:

fig = plt.figure(figsize=(16, 8))  # 设置画布

proj = ccrs.PlateCarree()  # 创建一个投影
ax = plt.axes(projection=proj)  # 创建一个画纸, 并指明投影类型
ax.coastlines()  # 画海岸线


# 设置范围
extent = [-180, 180, -90, 90]

# 添加地理坐标
add_geo_ticks(ax, proj, extent, lat_span = 30, lon_span = 60)

# 设置刻度字体大小
ax.tick_params(labelsize=15) 

添加地理特征
cartopy包里自带了七种特征,它们分别如下:
(参考链接:https://scitools.org.uk/cartopy/docs/latest/matplotlib/feature_interface.html#cartopy.feature.LAND

地理特征.png

add_feature()函数说明:
参考(https://scitools.org.uk/cartopy/docs/v0.16/matplotlib/geoaxes.html#cartopy.mpl.geoaxes.GeoAxes.add_feature)

add_feature()函数说明.png

添加地理特征代码:

import cartopy.feature as cfeature

fig = plt.figure(figsize=(16, 8))  # 设置画布

proj = ccrs.PlateCarree()  # 创建一个投影
ax = plt.axes(projection=proj)  # 创建一个画纸, 并指明投影类型
ax.coastlines()  # 画海岸线


# 设置范围
extent = [-180, 180, -90, 90]

# 添加地理坐标
add_geo_ticks(ax, proj, extent, lat_span = 30, lon_span = 60)

# 设置刻度字体大小
ax.tick_params(labelsize=15) 


ax.add_feature(cfeature.LAND)
ax.add_feature(cfeature.OCEAN)
ax.add_feature(cfeature.COASTLINE)
ax.add_feature(cfeature.BORDERS, linestyle=':')
ax.add_feature(cfeature.LAKES, alpha=0.5)
ax.add_feature(cfeature.RIVERS)
添加地理特征后的地图.png
上一篇 下一篇

猜你喜欢

热点阅读