目录
cartopy库来创建地图底图
shp文件
- 下载好绘制地区的shp文件数据
地图绘制代码
引入所需要的库
import matplotlib as mpl
import matplotlib.pyplot as plt
import cartopy.crs as ccrs
import cartopy.io.shapereader as shpreader
from cartopy.mpl.gridliner import LONGITUDE_FORMATTER, LATITUDE_FORMATTER
路径设置
- extents设置合适和经纬度范围
- filepath为shp文件路径
extents = [116, 119, 33, 36]
filepath = 'D:\\地图shp\\徐州市\徐州市.shp'
文件读入与地图绘制
ax.add_geometries中:
- lw可设置线宽;
- fc设置地图面的颜色
crs = ccrs.PlateCarree()
fig = plt.figure(figsize=[8,10])
ax = fig.add_subplot(111, projection=crs)
ax.set_extent(extents, crs)
reader = shpreader.Reader(filepath)
geoms = reader.geometries()
ax.add_geometries(geoms, crs, lw=1, fc='none')
plt.show()
代码执行结果
经纬度添加
ax.gridlines()添加经纬度
- draw_labels设置标签是否显示
- 通过ax.gridlines设置经纬度,0.5为经纬度间隔
- linestyle设置网格线类型,linestyle='--'为虚线
- linewidth设置网格线宽度,linewidth=0即不添加网格线
gl = ax.gridlines(draw_labels=True,
xlocs=np.arange(extents[0], extents[1], 0.5), # 经度位置,包含边界值
ylocs=np.arange(extents[2], extents[3], 0.5),
xformatter=LONGITUDE_FORMATTER,
yformatter=LATITUDE_FORMATTER,
linestyle='--',
linewidth=1)
代码执行结果
绘制采样散点图
数据准备(杜撰)
- lon,lat为点位的经纬度
- values为每个点位所代表的数据大小
lon=[117.14509,118,117.8,116.8,117.5,117.8]
lat=[34.214571,34.5,34,34.6,34.3,34.3]
values=[75,60,50,30,20,35]
绘制散点图
- 在地图上绘制所需要的散点图和坐标系中类似用ax.scatter即可,横纵坐标即为点位的经纬度
- transform=ccrs.PlateCarree()参数来确保散点的坐标被正确转换到地图的坐标参考系统
ax.scatter(lon, lat, transform=ccrs.PlateCarree(),s =150,alpha=0.5,edgecolors='black')
代码执行结果
颜色映射大小
此外我们可以用颜色来映射值values的大小
ax.scatter()中
- c参数用于设置每个点的颜色,点的颜色根据values数组中的值进行映射。
- s设置点的大小,这里用values的倍数表示点的大小
- cmap参数指定颜色映射,颜色选择可见下面文章,其中'RdYlGn_r' 是 'RdYlGn' 颜色映射的反转版本
plt.colorbar()用于创建一个色条
- location设置色调位置
- pad设置色条距离子图的间距
- shrink用于缩小色条的大小
- aspect设置色条的宽度与其高度的比例
cbar.set_label()设置色条标题
scatter=ax.scatter(lon, lat,
transform=ccrs.PlateCarree(),
s =120,
alpha=0.7,
edgecolors='black',
c=values,
cmap='RdYlGn_r')
cbar = plt.colorbar(scatter, ax=ax, location='right',pad=0.1,
shrink=0.5, aspect=15)
cbar.set_label('PM10')
ax.set_title('徐州市监测点位PM10分布', fontsize=12)