数据分析之basemap模块

Basemap模块

basemap是干什么的
  • Basemap是Matplotlib的一个子包,负责地图绘制。在数据可视化过程中,我们常需要将数据在地图上画出来。
  • 比如说我们在地图上画出城市人口,飞机航线,军事基地,矿藏分布等等。这样的地理绘图有助于读者理解空间相关的信息。
安装

不能直接使用pip安装

  1. 下载basemap和pyproj(与自己的python版本和电脑版本对应)
    地址:https://www.lfd.uci.edu/~gohlke/pythonlibs/

  2. 在命令行模式下使用pip/pip3安装

  • 先执行pip3 install pyproj路径.whl

  • 再执行 pip3 install basemap路径.whl

开始画图
  • 画一个世界地图
import matplotlib.pyplot as plt
from mpl_toolkits.basemap import Basemap
plt.figure(figsize=(10, 6))
m = Basemap()   # 创建一个地图
m.drawcoastlines()   # 画海岸线
plt.show()   # 显示图像

在这里插入图片描述

  • 显示出国家分界线(只需加一行代码)
m.drawcounties(linewidth=1)     # 画国家分界线
  • 画中国地图
    在建立地图时添加中国的经纬度参数
import matplotlib.pyplot as plt
from mpl_toolkits.basemap import Basemap
plt.figure(figsize=(10, 6))
m = Basemap(llcrnrlon=77, llcrnrlat=14, urcrnrlon=140, urcrnrlat=51, projection='lcc', lat_1=33, lat_2=45, lon_0=100)
# m = Basemap(llcrnrlon=73, llcrnrlat=18, urcrnrlon=135, urcrnrlat=53)
m.drawcountries(linewidth=1.5)
m.drawcoastlines()
plt.show()

在这里插入图片描述

  • 为中国地图添加省份

下载中国大陆和台湾省的行政区域的shape文件,下载后解压
地址:https://gadm.org/download_country_v3.html

import matplotlib.pyplot as plt
from mpl_toolkits.basemap import Basemap

plt.figure(figsize=(10, 6))
m = Basemap(llcrnrlon=77, llcrnrlat=14, urcrnrlon=140, urcrnrlat=51, projection='lcc', lat_1=33, lat_2=45, lon_0=100)
m.drawcountries(linewidth=1.5)
m.drawcoastlines()
China = "E:\\新建文件夹\\Basemap_china_shape"
# 加入中国大陆的省界
m.readshapefile(China + '\\gadm36_CHN_shp\\gadm36_CHN_1', 'states', drawbounds=True)
# 加入台湾的省界
m.readshapefile(China + '\\gadm36_TWN_shp\\gadm36_TWN_1', 'taiwan', drawbounds=True)
plt.show()

在这里插入图片描述

  • 在地图上加上经纬度
import matplotlib.pyplot as plt
from mpl_toolkits.basemap import Basemap
import numpy as np

plt.figure(figsize=(10, 6))
m = Basemap(llcrnrlon=77, llcrnrlat=14, urcrnrlon=140, urcrnrlat=51, projection='lcc', lat_1=33, lat_2=45, lon_0=100)
m.drawcountries(linewidth=1.5)
m.drawcoastlines()
China = "E:\\新建文件夹\\Basemap_china_shape"
# 加入中国大陆的省界
m.readshapefile(China + '\\gadm36_CHN_shp\\gadm36_CHN_1', 'states', drawbounds=True)
# 加入台湾的省界
m.readshapefile(China + '\\gadm36_TWN_shp\\gadm36_TWN_1', 'taiwan', drawbounds=True)
# 在地图上加上经纬度
parallels = np.linspace(3, 55, 5)   # 生成3到55之间的5个等差数列
m.drawparallels(parallels, labels=[True, False, False, False])
meridians = np.linspace(70, 140, 5)
m.drawmeridians(meridians, labels=[False, False, False, True])
plt.show()

在这里插入图片描述

通过经纬度在地图上标出点
import matplotlib.pyplot as plt
from mpl_toolkits.basemap import Basemap
import numpy as np

plt.figure(figsize=(10, 6))
m = Basemap()  # 实例化一个map
m.drawcoastlines()  # 画海岸线
m.drawmapboundary(fill_color='white')
m.fillcontinents(color='white', lake_color='white')  # 画大洲,颜色填充为白色

parallels = np.arange(-90., 90., 10.)  # 这两行画纬度,范围为[-90,90]间隔为10
m.drawparallels(parallels, labels=[False, True, True, False])
meridians = np.arange(-180., 180., 20.)  # 这两行画经度,范围为[-180,180]间隔为10
m.drawmeridians(meridians, labels=[True, False, False, True])
lon = [-140, 0, -20, 160, -100]  # 西负东正
lat = [60, 0, -30, 40, -30]      # 北正南负
lon, lat = m(lon, lat)  # lon, lat为给定的经纬度,可以使单个的,也可以是列表
m.scatter(lon, lat, s=100, c="red")  # 标注出所在的点,s为点的大小,还可以选择点的性状和颜色等属性
plt.show()

在这里插入图片描述

from mpl_toolkits.basemap import Basemap
import matplotlib.pyplot as plt
import numpy as np
plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号

# 读取数据
names = []
pops = []
lats = []
lons = []
countries = []
file = open("test_file", encoding='utf-8').readlines()
# 循环遍历每一行数据
for line in file:
    info = line.split()
    names.append(info[0])
    pops.append(float(info[1]))
    lat = float(info[2][:-1])  # 读取纬度的数字部分
    if info[2][-1] == 'S':     # 如果是南极则取负号
        lat = -lat
    lats.append(lat)
    lon = float(info[3][:-1])
    if info[3][-1] == 'W':     # 读取经度的数字部分
        lon = -lon + 360.0     # 如果是西经则取负号
    lons.append(lon)
    country = info[4]
    countries.append(country)


plt.figure(figsize=(10, 6))
# projection参数规定了投影方法。改变投影方法,绘图结果也将非常不同。
map = Basemap(projection='ortho', lat_0=35, lon_0=120, resolution='l')   # 实例化一个map
# 画海岸线
map.drawcoastlines(linewidth=0.25)
# 画国家分界线
map.drawcountries(linewidth=0.25)
# 绘制地图投影区域的边缘(投影肢体)
map.drawmapboundary(fill_color='#689CD2')
# 每隔30度绘制纬度/经度网格线.
map.drawmeridians(np.arange(0, 360, 30))
map.drawparallels(np.arange(-90, 90, 30))
# 用不同的颜色填满大陆
map.fillcontinents(color='#BF9E30', lake_color='#689CD2', zorder=0)
# 计算lat/lon网格的自然地图投影坐标.
# 我们想要把经纬度对应图像的像素点,需要转换
x, y = map(lons, lats)
max_pop = max(pops)
size_factor = 80.0
y_offset = 15.0
rotation = 30
for i, j, k, name in zip(x, y, pops, names):
    size = size_factor*k/max_pop
    cs = map.scatter(i, j, s=size, marker='o', color='#FF5600')
    plt.text(i, j+y_offset, name, rotation=rotation, fontsize=10)

plt.title('亚洲主要城市与人口')
plt.show()

在这里插入图片描述
在这里插入图片描述

Basemap应用实例
  • 蓝色弹珠
import matplotlib.pyplot as plt
from mpl_toolkits.basemap import Basemap
plt.figure(figsize=(8, 8))
# 正射投影,投影原点设在了上海周边
m = Basemap(projection='ortho', resolution=None, lat_0=30, lon_0=120)
# 图像原始分辨率是5400*2700,设置scale = 0.5以后分辨率为2700*1350,如此作图
# 迅速不少也不那么占用内存了
m.bluemarble(scale=0.5)

在这里插入图片描述

更多有趣的内容阅读https://www.jianshu.com/p/e36d1b4c455a

发布了60 篇原创文章 · 获赞 6 · 访问量 7781

猜你喜欢

转载自blog.csdn.net/qq_44205272/article/details/103100505