前一篇介绍了如何使用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()
案例二——美国各州航线频次可视化:
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包的填充地图、线段图、散点(气泡)图都已经介绍完了,是不是效果还不错呢~