前一篇介绍了如何使用mpl_toolkits包中的basemap模块制作填充地图,这一节继续分享线图+点图的应用。
案例一:
1、导入依赖包:
import pandas as pdimport numpy as npimport matplotlib.pyplot as pltfrom mpl_toolkits.basemap import Basemap %matplotlib inline
2、导入制作点线的数据源:
province_city = pd.read_csv("D:/R/rstudy/Province/chinaprovincecity.csv",encoding = "gbk") cities = ["北京","上海","天津","重庆","沈阳","呼和浩特","太原","西安","兰州","合肥","南京","杭州","长沙","武汉"]
3、构建线段的起始点数据:
#以郑州为核心,向其他外围城市扩展new_data = province_city.loc[province_city.city.isin(cities),["city","jd","wd","zhibiao","class"]] new_data["start_lon"] = province_city.loc[province_city.city == "郑州","jd"].tolist()*len(new_data) new_data["start_lat"] = province_city.loc[province_city.city == "郑州","wd"].tolist()*len(new_data)#对线段分组设置不同的色值Type_Dict = { "A": "#C72E29", "B": "#016392", "C": "#be9c2e", "D": "#098154", "C": "#fb832d" } new_data["Color"] = new_data["class"].map(Type_Dict)
fig = plt.figure(figsize=(20,16)) ax1 = fig.add_axes([0.1,0.1,0.8,0.8]) map = Basemap(projection='poly',lat_0=35,lon_0=110,llcrnrlon=80,llcrnrlat=3.01,urcrnrlon=140,urcrnrlat=53.123,resolution='h',area_thresh=1000,rsphere=6371200.,ax = ax1) map.readshapefile("D:/R/rstudy/CHN_adm/bou2_4p","china",drawbounds=True) map.drawcoastlines() map.drawcountries() map.fillcontinents(color = 'coral',alpha = .1) map.drawmapboundary() map.drawparallels(np.arange(0.,90,10.),labels=[1,0,0,0],fontsize=10) map.drawmeridians(np.arange(80.,140.,10.),labels=[0,0,0,1],fontsize=10) #定义一个勾勒两点之间线段的函数:def create_great_circles(df):
for index,row in df.iterrows(): start_lon = row['start_lon'] start_lat = row['start_lat'] end_lon = row['jd'] end_lat = row['wd']
if abs(end_lat - start_lat) < 180 and abs(end_lon - start_lon) < 180: map.drawgreatcircle(start_lon, start_lat, end_lon, end_lat, linewidth=1,color = "grey") create_great_circles(new_data)
#定义一个填充散点图颜色、大小的函数:
def create_great_points(df): lon = np.array(new_data["jd"]) lat = np.array(new_data["wd"]) pop = np.array(new_data["zhibiao"],dtype=float) color = new_data["Color"].tolist() x,y = map(lon,lat) for lon,lat,pop,color in zip(x,y,pop,color): map.scatter(lon,lat,marker = "o",s = pop*5,color = color) create_great_points(new_data) plt.savefig('C:/Users/RAINDU/Desktop/China.png',dpi=100,bbox_inches='tight') plt.show()
案例二——美国各州航线频次可视化:
从plotly官网下载数据源:
air = pd.read_csv('https://raw.githubusercontent.com/plotly/datasets/master/2011_february_us_airport_traffic.csv') #机场航线数据量flights = pd.read_csv('https://raw.githubusercontent.com/plotly/datasets/master/2011_february_aa_flight_paths.csv')#机场间航线图
初始化地图背景并添加国界线、海岸线、经纬度线等
fig = plt.figure(figsize=(16,12)) ax1 = fig.add_axes([0.1,0.1,0.8,0.8]) map = Basemap(projection='ortho', lat_0=50, lon_0=-100,resolution='l', area_thresh=1000.0,ax = ax1) map.drawcoastlines() map.drawcountries() map.fillcontinents(color = 'coral',alpha = .1) map.drawmapboundary() map.drawmeridians(np.arange(0, 360, 30)) map.drawparallels(np.arange(-90, 90, 30))#定义一个勾勒两点之间线段的函数:
def create_great_circles(df):
for index,row in df.iterrows(): start_lon = row['start_lon'] start_lat = row['start_lat'] end_lon = row['end_lon'] end_lat = row['end_lat']
if abs(end_lat - start_lat) < 180 and abs(end_lon - start_lon) < 180: map.drawgreatcircle(start_lon, start_lat, end_lon, end_lat, linewidth=1,color = "#DF666A")
#执行航线绘制函数
create_great_circles(flights)
#定义一个填充散点图颜色、大小的函数:
def create_great_points(df): lon = np.array(df["long"]) lat = np.array(df["lat"]) pop = np.array(df["cnt"],dtype=float) x,y = map(lon,lat) for lon,lat,pop in zip(x,y,pop): map.scatter(lon,lat,marker = "o",s = pop/50,color = "#088158")
#执行散点图填充函数
create_great_points(air)
#保存图表
plt.savefig('C:/Users/RAINDU/Desktop/China1.png',dpi=100,bbox_inches='tight') plt.show()
到此basemap包的填充地图、线段图、散点(气泡)图都已经介绍完了,是不是效果还不错呢~
https://edu.hellobi.com/course/264