Python数据可视化与basemap数据地图系列2——点线图

浏览: 2569

前一篇介绍了如何使用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


推荐 0
本文由 杜雨 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

0 个评论

要回复文章请先登录注册