本节提要:简单介绍使用geoplot来绘制地理桑基图(sankey)
conda install -c conda-forge geoplot
import geoplot as gplt
import geoplot.crs as gcrs
import geopandas as gpd
import matplotlib.pyplot as plt
import cartopy.crs as ccrs
import mapclassify as mc
import numpy as np
import pandas as pd
import cartopy.io.shapereader as shpreader
from shapely.geometry import MultiPoint
extent=[108.3,109.35,29.7,30.7]
plt.rcParams['font.sans-serif']=['SimHei']
a=gpd.read_file(r'E:\2020-06-09利川市行政边界50\利川市_行政边界乡镇\利川市_行政边界.shp').to_crs('EPSG:4326')
lichuan_center=(108.95,30.29)
data=np.random.rand(15)
b=a.bounds
olon=(b['minx']+b['maxx'])/2
olat=(b['miny']+b['maxy'])/2
multipoints=[]
for x,y in zip(olon,olat):
multipoints.append(MultiPoint([lichuan_center, (x, y)]))
d = {'data': data,
'geometry': multipoints}
gdf=gpd.GeoDataFrame(d, crs=4326)
fig=plt.figure(figsize=(2,2),dpi=500)
ax=fig.add_axes([0,0,1,1])
gplt.sankey(ax=ax,df=gdf,hue='data',scale='data',cmap='Reds',lw=1.5,zorder=1)
gplt.polyplot(a, ax=ax, facecolor='lightgray', edgecolor='k',lw=0.5)
ax.scatter(olon,olat,s=2,color='k',zorder=2)
ax.set(xlim=(108.3,109.35),ylim=(29.7,30.7))
ax.axis('off')
import matplotlib.pyplot as plt
import numpy as np
import cartopy.crs as ccrs
import cartopy.io.shapereader as spr
import cartopy.mpl.ticker as cmt
import matplotlib.ticker as mticker
import geopandas as gpd
plt.rcParams['font.sans-serif']=['KaiTi']
shp_path=r'E:\家园\利川市地图\利川.shp'
fig=plt.figure(figsize=(2,2),dpi=500)
ax=fig.add_axes([0,0,1,1],projection=ccrs.PlateCarree())
ax.add_geometries(spr.Reader(shp_path).geometries(),crs=ccrs.PlateCarree(),edgecolor='k',facecolor='none',lw=0.5)
ax.set_extent([108.3,109.35,29.7,30.7],crs=ccrs.PlateCarree())
ax.set_xticks(np.arange(108.3,109.35,0.21))
ax.set_yticks(np.arange(29.7,30.7,0.2))
ax.xaxis.set_major_formatter(cmt.LongitudeFormatter())
ax.yaxis.set_major_formatter(cmt.LatitudeFormatter())
ax.tick_params(direction='in',labelsize=3,top=True,right=True,length=2,width=0.5)
gl=ax.gridlines(draw_labels=False,linewidth=0.5,linestyle='--')
gl.xlocator=mticker.FixedLocator(np.arange(108.3,109.35,0.21))
gl.ylocator=mticker.FixedLocator(np.arange(29.7,30.7,0.2))
center=(108.95,30.29)
a=gpd.read_file(r'E:\2020-06-09利川市行政边界50\利川市_行政边界乡镇\利川市_行政边界.shp').to_crs('EPSG:4326')
b=a.bounds
lons=(b['minx']+b['maxx'])/2
lats=(b['miny']+b['maxy'])/2
data=np.random.rand(15)
def draw_sankey(ax,center,lon,lat,data):
for lo,la,d,in zip(lon,lat,data):
ax.annotate('',
xy=(lo,la),
xytext=center,
size=20,
va='center',
ha='center',
arrowprops=dict(connectionstyle='arc3,rad=-0.2',
edgecolor='none',
width=d/data.max()*3,headwidth=d/data.max()*5) )
ax.scatter(lo,la,c='k',s=5)
ax.text(lo,la+0.02,'{:.1f}'.format(d),fontsize=3)
return ax
draw_sankey(ax,center,lons,lats,data)
plt.show()
联系客服