matplotlib 在Map上绘制点,但错误代码为“ValueError:“box_aspect”和“fig_aspect”必须为正数”

rdrgkggo  于 2023-03-19  发布在  其他
关注(0)|答案(3)|浏览(223)

我正试图在华盛顿州金郡的图形上绘制一组点。
我可以用下面的代码显示图形:

fig, ax = plt.subplots(figsize = (15,15))
kings_county.plot(ax=ax)

这给了我图形。然后我从我加载的csv的lat/long中读取点。

df = pd.read_csv('kc_house_data_train.csv')
crs = {'init': 'epsg:4326'}

这会把所有的点放到一个新的 Dataframe 中

geometry = [Point(x,y) for x,y in zip(df.lat,df.long)]

geo_df = gpd.GeoDataFrame(df, # specifify your dataframe
                          crs = crs, # this is your coordinate system
                          geometry = geometry) # specify the geometry list we created

但是当我这么做的时候

fig, ax = plt.subplots(figsize = (40,40))
kings_county.plot(ax=ax, alpha = 0.4, color = 'grey', aspect = 'auto')
geo_df[geo_df.price >= 750000].plot(ax = ax , markersize = 20, color = 'blue',marker = 'o',label = 'pricey')
geo_df[geo_df.price < 750000].plot(ax = ax , markersize = 20, color = 'blue',marker = 'o',label = 'pricey')
plt.legend()

它只返回一个错误:数值错误:'box_aspect'和'fig_aspect'必须为正数不确定为什么加载图形有效,但添加的点使其中断。
只是想了解这一点和修复,如果可以的话。谢谢

yzckvree

yzckvree1#

我通过设置gdf.plot(aspect=1)解决了这个问题。在以前版本的geopandas中没有发生过这种情况,但突然开始发生,我认为这只是这个参数,因为它可以在您给出的错误中读取。

czq61nw1

czq61nw12#

我遇到了这个问题,发现Shapely多边形(x,y)坐标是(经度,纬度),所以我只需要在zip函数中切换lat/long顺序,一切都正常工作。感谢this thread的解决方案。

mxg2im7a

mxg2im7a3#

这是一个典型的CRS与实际几何形状不匹配的情况。注意OP滚动了自己的GeoDataFrame,创建了自己的几何形状列表 * 并进行了横向转置 *。因此,会出现这种不匹配。
请注意,用于创建GeoDataFrame的documentation以这种方式给出了示例

gdf = geopandas.GeoDataFrame(
    df, geometry=geopandas.points_from_xy(df.Longitude, df.Latitude))

和国家
我们使用geopandas points_from_xy()将Longitude和Latitude转换为shapely.Point对象列表,并在创建GeoDataFrame时将其设置为几何体。(请注意,points_from_xy()[Point(x, y) for x, y in zip(df.Longitude, df.Latitude)]的增强 Package 器)
注意zip()中纬度/经度的顺序相对于OP的颠倒。
我发现这个线程在加载一个.gpkg之后遇到了这个错误,这个错误与之前的python环境是相同的,这是一个数据问题,而不是geopandas版本的问题,在我的例子中,我在阅读它之后检查了数据边界,并得到了

wensum_manual.total_bounds
array([607560.35533316, 324060.06511765, 615703.81324167, 327821.37222748])

然后检查存储的CRS,我得到了

wensum_manual.crs
<Geographic 2D CRS: EPSG:4326>
Name: WGS 84
Axis Info [ellipsoidal]:
- Lat[north]: Geodetic latitude (degree)
- Lon[east]: Geodetic longitude (degree)
Area of Use:
- name: World.
- bounds: (-180.0, -90.0, 180.0, 90.0)
Datum: World Geodetic System 1984 ensemble
- Ellipsoid: WGS 84
- Prime Meridian: Greenwich

等等,这些边界看起来不像纬度/经度!是的,aspect=1标志抑制了错误,并允许绘图渲染,但这不是正确的修复。

wensum_manual = wensum_manual.set_crs(epsg=27700, allow_override=True)

相关问题