如何解决set_xlim不适用于文本标签
我正在尝试使用带有set_xlim()
和matplotlib的标签来放大Geopandas地图。我基本上修改了this SO question以便在地图上添加标签。
但是,set_xlim()
似乎不起作用,也没有放大给定的范围。 (顺便说一句,我也尝试使用text()
代替annotate()
,但无济于事。)
我所做的是:
我在上面链接的问题中使用了same US county data,提取了文件,然后在Jupyter笔记本中执行以下操作:
import geopandas as gpd
import matplotlib.pyplot as plt
%matplotlib inline
shpfile='shp/cb_2015_us_county_20m.shp'
gdf=gpd.read_file(shpfile)
gdf.plot()
,它给出了预期的美国所有县的地图:
添加与答案之一相同的标签也可以:
ax = gdf.plot()
gdf.apply(lambda x: ax.annotate(s=x.NAME,xy=x.geometry.centroid.coords[0],ha='center'),axis=1);
但是,当尝试使用set_xlim()
和set_ylim()
如下放大特定的地理范围时:
ax = gdf.plot()
gdf.apply(lambda x: ax.annotate(s=x.NAME,axis=1);
ax.set_xlim(-84.2,-83.4)
ax.set_ylim(42,42.55)
,这两个功能似乎不起作用。他们没有放大,而是修剪了超出给定范围的所有内容。
如果标签代码丢失(gdf.apply(lambda x: ax.annotate(s=x.NAME,axis=1);
,则set_xlim()
会按预期工作:
我的问题是:
当图中有标签时,放大区域的正确方法是什么?
解决方法
您需要一些坐标转换。
import cartopy.crs as ccrs
# relevant code follows
# set numbers in degrees of longitude
ax.set_xlim(-84.2,-83.4,ccrs.PlateCarree())
# set numbers in degrees of latitude
ax.set_ylim(42,42.55,ccrs.PlateCarree())
plt.show()
使用选项ccrs.PlateCarree()
,输入值将转换为正确的data
坐标。
尝试时,无法在轴受限的情况下在matplotlib上绘制。这样就可以提取数据了。
import geopandas as gpd
import matplotlib.pyplot as plt
%matplotlib inline
fig,ax = plt.subplots(1,1,figsize=(4,4),dpi=144)
shpfile = './cb_2015_us_county_20m/cb_2015_us_county_20m.shp'
gdf = gpd.read_file(shpfile)
# gdf = gdf.loc[gdf['STATEFP'] == '27']
gdf['coords'] = gdf['geometry'].apply(lambda x: x.representative_point().coords[:])
gdf['coords'] = [coords[0] for coords in gdf['coords']]
gdf = (gdf[(gdf['coords'].str[0] >= -84.2) & (gdf['coords'].str[0] <= -83.4)
& (gdf['coords'].str[1] >= 42) & (gdf['coords'].str[1] <= 42.55)])
gdf.plot(ax=ax)
gdf.apply(lambda x: ax.annotate(text=x.NAME,xy=x.geometry.centroid.coords[0],ha='center'),axis=1)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。