Matplotlib
自
带
4
类别
地理投影:
Aitoff, Hammer, Mollweide
及
Lambert
投影,可以
结
合以下四
张
不同
的
图
了解四
种
不同投影
区别
。
12.1Aitoff投影
12.1.1图像呈现
12.1.2绘图代码
import numpy as np # 导入numpy库,用于处理数组和数值计算
import matplotlib.pyplot as plt # 导入matplotlib的绘图模块,用于可视化
from matplotlib import rcParams # 从matplotlib中导入rcParams,它用于处理matplotlib的配置参数
# 定义一个字典config,其中包含字体、大小和其他相关的配置参数
config = {"font.family": 'serif', "font.size": 10.5, "mathtext.fontset": 'stix', "font.serif": ['SimSun']}
rcParams.update(config) # 使用config字典中的配置参数更新rcParams
plt.rcParams['axes.unicode_minus'] = False # 运行配置参数总的轴(axes)正常显示正负号(minus)
N = 100# 定义数据点的数量为100
np.random.seed(157)# 设置随机种子,使生成的随机数可复现
long = np.random.random(N) * 360 - 180# 生成[-180, 180]范围内的随机经度
lat = np.random.random(N) * 180 - 90# 生成[-90, 90]范围内的随机纬度
plt.figure(figsize=(12, 7), dpi=110)# 创建一个新的图形窗口,并设置其大小和分辨率
plt.subplot(111,projection="aitoff" )# 创建一个子图,使用aitoff投影方式
plt.scatter(long, lat, marker='*', color='red', s=40)# 在子图上绘制散点图,设置散点样式、颜色和大小
plt.title("Aitoff")
plt.grid(True)# 显示网格线
plt.show()
12.2 Hammer投影
12.2.1图像呈现
12.2.2绘图代码
import numpy as np # 导入numpy库,用于处理数组和数值计算
import matplotlib.pyplot as plt # 导入matplotlib的绘图模块,用于可视化
from matplotlib import rcParams # 从matplotlib中导入rcParams,它用于处理matplotlib的配置参数
# 定义一个字典config,其中包含字体、大小和其他相关的配置参数
config = {"font.family": 'serif', "font.size": 10.5, "mathtext.fontset": 'stix', "font.serif": ['SimSun']}
rcParams.update(config) # 使用config字典中的配置参数更新rcParams
plt.rcParams['axes.unicode_minus'] = False # 运行配置参数总的轴(axes)正常显示正负号(minus)
# 导入cartopy的crs模块,crs代表坐标参考系统(Coordinate Reference Systems)
import cartopy.crs as ccrs
# 导入cartopy的feature模块,这个模块提供了一些自然地理特征,如陆地、海洋等
import cartopy.feature as cfeature
# 创建一个新的图形和坐标轴
fig = plt.figure(figsize=(10, 5))
# 在图形中添加一个子图,设置其位置为1行1列的第1个位置,并设置其投影为Hammer投影
ax = fig.add_subplot(1, 1, 1, projection=ccrs.Hammer())
# 向坐标轴中添加自然地理特征,这里添加的是陆地和海洋
ax.add_feature(cfeature.LAND)
ax.add_feature(cfeature.OCEAN)
# 设置坐标轴的范围为全球,即显示整个地球
ax.set_global()
# 在坐标轴上绘制网格线,并设置draw_labels为True,表示在网格线上绘制标签
ax.gridlines(draw_labels=True)
# 显示图形
plt.show()
12.3Mollweide投影
12.3.1图像呈现
12.3.2绘图代码
import numpy as np # 导入numpy库,用于处理数组和数值计算
import matplotlib.pyplot as plt # 导入matplotlib的绘图模块,用于可视化
from matplotlib import rcParams # 从matplotlib中导入rcParams,它用于处理matplotlib的配置参数
# 定义一个字典config,其中包含字体、大小和其他相关的配置参数
config = {"font.family": 'serif', "font.size": 10.5, "mathtext.fontset": 'stix', "font.serif": ['SimSun']}
rcParams.update(config) # 使用config字典中的配置参数更新rcParams
plt.rcParams['axes.unicode_minus'] = False # 运行配置参数总的轴(axes)正常显示正负号(minus)
import cartopy.crs as ccrs
import cartopy.feature as cfeature
# 创建一个新的图形和坐标轴,设置投影为Mollweide
fig = plt.figure(figsize=(10, 5))
# 在图形中添加一个子图,并设置其投影为Mollweide投影
# Mollweide投影是一种等面积伪圆柱投影,能保持全球面积的比例
ax = fig.add_subplot(1, 1, 1, projection=ccrs.Mollweide())
# 向坐标轴中添加自然地理特征
# 添加陆地、海洋、国界(用虚线表示)和河流
ax.add_feature(cfeature.LAND)
ax.add_feature(cfeature.OCEAN)
ax.add_feature(cfeature.BORDERS, linestyle=':')
ax.add_feature(cfeature.RIVERS)
# 设置坐标轴范围为全球
ax.set_global()
# 如果需要,可以添加网格线
ax.gridlines()
# 显示图形
plt.show()
12.4Lambert投影
12.4.1图像呈现【方法1】
12.4.2绘图代码
import numpy as np # 导入numpy库,用于处理数组和数值计算
import matplotlib.pyplot as plt # 导入matplotlib的绘图模块,用于可视化
from matplotlib import rcParams # 从matplotlib中导入rcParams,它用于处理matplotlib的配置参数
# 定义一个字典config,其中包含字体、大小和其他相关的配置参数
config = {"font.family": 'serif', "font.size": 10.5, "mathtext.fontset": 'stix', "font.serif": ['SimSun']}
rcParams.update(config) # 使用config字典中的配置参数更新rcParams
plt.rcParams['axes.unicode_minus'] = False # 运行配置参数总的轴(axes)正常显示正负号(minus)
N = 100
np.random.seed(157)
long = np.random.random(N) * 2 * np.pi - np.pi
lat = np.random.random(N) * np.pi - (np.pi / 2)
plt.figure(figsize=(12, 7), dpi=110)
plt.subplot(111,projection="lambert")
plt.scatter(long, lat, marker='*', color='red', s=40)
plt.title("Lambert")
plt.grid(True)
plt.show()
12.4.3图像呈现【方法二】
12.4.4绘图代码
import numpy as np # 导入numpy库,用于处理数组和数值计算
import matplotlib.pyplot as plt # 导入matplotlib的绘图模块,用于可视化
from matplotlib import rcParams # 从matplotlib中导入rcParams,它用于处理matplotlib的配置参数
# 定义一个字典config,其中包含字体、大小和其他相关的配置参数
config = {"font.family": 'serif', "font.size": 10.5, "mathtext.fontset": 'stix', "font.serif": ['SimSun']}
rcParams.update(config) # 使用config字典中的配置参数更新rcParams
plt.rcParams['axes.unicode_minus'] = False # 运行配置参数总的轴(axes)正常显示正负号(minus)
N = 100
np.random.seed(157)
long = np.random.random(N) * 2 * np.pi - np.pi
lat = np.random.random(N) * np.pi - (np.pi / 2)
plt.figure(figsize=(12, 7), dpi=110)
plt.subplot(111,projection="lambert")
plt.scatter(long, lat, marker='*', color='red', s=40)
plt.title("Lambert")
plt.grid(True)
plt.show()
代码注释:
这段代码首先导入了必要的模块,然后创建了一个图形和一个子图,并设置了投影为Lambert Conformal投影。通过central_longitude
和central_latitude
参数,你可以设置投影的中心点。在这个例子中,中心经度设置为-90.0(西经90度),中心纬度设置为45.0(北纬45度),这通常用于展示北半球的地图。
然后,使用set_extent
方法设置了地图的边界范围。crs=ccrs.PlateCarree()
表示边界范围是在经纬度坐标系(Plate Carree投影)下定义的。
接下来,通过add_feature
方法添加了陆地、海洋、国界和河流等自然地理特征。
最后,使用gridlines
方法添加了网格线,并通过plt.show()
显示了图形。
12.5几种绘图方式的比较
Aitoff投影、Hammer投影、Mollweide投影和Lambert投影都是地理学和地图制作中常用的投影方式,它们各自具有不同的特点和适用场景。
12.5.1投影方式对比说明
- Aitoff投影:
- 特点:Aitoff投影是经过改进的方位投影,采用椭圆形经纬网的折衷投影。它适用于绘制小比例的世界地图。
- 适用场景:由于其经纬网的特性,Aitoff投影在展示全球数据时能够保持较好的形状和面积平衡,但会引入一定程度的畸变。
- 发明者:由俄罗斯制图员David A. Aitoff于1889年开发。
- Hammer投影(哈默投影):
- 特点:Hammer投影是由等面积横轴方位投影派生而来,它等面积地表示整个世界。其经纬线网交点坐标由等面积横轴方位投影的每一横坐标乘以2得到,并重新注记经线。
- 适用场景:Hammer投影常用于制作小比例尺世界地图,因为它能够保持全球面积的比例不变,这对于需要准确展示面积分布的地图尤为重要。
- 发明者:由德国学者H.H.E.哈默(H.H.Ernst von Hammer)于1892年应用Aitoff变换方法拟定。
- Mollweide投影(摩尔威德投影):
- 特点:Mollweide投影是一种等面积伪圆柱投影,它将经线投影成为椭圆曲线。这种投影方式能够保持全球面积的比例。
- 适用场景:由于其等面积的特性,Mollweide投影在需要准确反映面积分布的地图制作中特别有用,如气候学、地理学等领域的研究。
- 发明者:由德国数学家摩尔威德(K.B.Mollweide)于1805年创拟。
- Lambert投影(兰伯特投影):
- 特点:Lambert投影是一种保形投影,它在一定区域内保持形状的真实性。它有多种变种,如正轴Lambert投影、斜轴Lambert投影等。
- 适用场景:Lambert投影常用于特定区域的地图制作,如中纬度地区的详细地图。由于其保形特性,它在需要准确反映形状和方向的应用中表现出色。
- 发明者与变种:Lambert投影由德国数学家Johann Heinrich Lambert提出,并有多种变种以适应不同的地图制作需求。
12.5.2总结归纳
- Aitoff投影和Hammer投影都适用于小比例尺的世界地图制作,其中Aitoff投影更注重形状和面积的平衡,而Hammer投影则强调面积的准确性。
- Mollweide投影以其等面积的特性在需要反映面积分布的地图制作中占据优势。
- Lambert投影则以其保形特性在特定区域地图制作中表现出色。
在选择投影方式时,需要根据地图的用途、比例尺、展示的数据类型以及所需的准确性和可读性等因素进行综合考虑。