解决 Altiair 中的上行绘图和投影问题

问题描述 投票:0回答:1

我正在尝试使用 ONS 的一些数据绘制伦敦的多层地图。

import geopandas as gpd
from shapely import wkt

# Convert the 'geometry' column to shapely geometry objects
london_wards_shp['geometry'] = london_wards_shp['geometry'].apply(wkt.loads)
london_wards_gpd = gpd.GeoDataFrame(london_wards_shp, geometry='geometry')
london_wards_gpd = london_wards_gpd.set_crs(epsg=4326)
london_wards_gpd.plot()

返回错误:

ValueError: aspect must be finite and positive 

我找到了绘图的解决方案:

london_wards_gpd.plot(aspect=1)

但后来我想使用 Altair 来构建图层,一个具有整个图层图的图层。

london_wards_map = alt.Chart(london_wards_gpd).mark_geoshape( fill=None, # 不填充 border='darkkgray', # 黑色描边 strokeWidth=1 # 描边宽度 ).encode( tooltip='NAME:N' # 将 'NAME' 替换为包含病房名称的列的实际名称 ).properties( 宽度=800, 高度=600 ).project( 类型='身份')

hackney_wards = london_wards_gpd[london_wards_gpd['DISTRICT'] =='哈克尼'] #hackney_wards = gpd.GeoDataFrame(hackney_wards, Geometry='geometry') # 将DataFrame转换为GeoDataFrame #hackney_wards = hackney_wards.set_crs(epsg=4326) hackney_layer = alt.Chart(hackney_wards).mark_geoshape( fill='lightgray', # 无填充 border='darkkgray', # 黑色描边 strokeWidth=1 # 描边宽度 ).encode( tooltip='NAME:N' # 将 'NAME' 替换为包含病房名称的列的实际名称 ).properties( 宽度=800, 高度=600 ).project( 类型='身份')

london_wards_map + hackney_layer

那为什么是颠倒的呢?

另一个问题。

我想在上面放第三层。

邮政编码_meals.crs = 4326 点 = alt.Chart(postcode_meals).mark_circle(color='#008751').encode( 经度='长:Q', 纬度='lat:Q', size=alt.Size('count:Q',scale=alt.Scale(domain=[postcode_meals['count'].min(),postcode_meals['count'].max()],range=[10, 1000 ])), # 根据需要调整范围 tooltip=['病区', '邮政编码', '计数', '长', '纬度'] ).properties(title='按邮政编码列出的优惠券地图')

text = alt.Chart(postcode_meals).mark_text(dy=-5).encode( 经度='长:Q', 纬度='lat:Q', text='邮政编码' )

将病区边界与点和文本相结合

积分

作为测试图,它看起来是正确的。

但是当我尝试将它们分层时......

不太确定如何诊断这里的投影问题

我正在尝试使用 ONS 的一些数据绘制伦敦的多层地图。

import geopandas as gpd
from shapely import wkt

# Convert the 'geometry' column to shapely geometry objects
london_wards_shp['geometry'] = london_wards_shp['geometry'].apply(wkt.loads)
london_wards_gpd = gpd.GeoDataFrame(london_wards_shp, geometry='geometry')
london_wards_gpd = london_wards_gpd.set_crs(epsg=4326)
london_wards_gpd.plot()

返回错误:

ValueError: aspect must be finite and positive 

我找到了绘图的解决方案:

london_wards_gpd.plot(aspect=1)

但后来我想使用 Altair 来构建图层,一个具有整个图层图的图层。

london_wards_map = alt.Chart(london_wards_gpd).mark_geoshape( fill=None, # 不填充 border='darkkgray', # 黑色描边 strokeWidth=1 # 描边宽度 ).encode( tooltip='NAME:N' # 将 'NAME' 替换为包含病房名称的列的实际名称 ).properties( 宽度=800, 高度=600 ).project( 类型='身份')

hackney_wards = london_wards_gpd[london_wards_gpd['DISTRICT'] =='哈克尼'] #hackney_wards = gpd.GeoDataFrame(hackney_wards, Geometry='geometry') # 将DataFrame转换为GeoDataFrame #hackney_wards = hackney_wards.set_crs(epsg=4326) hackney_layer = alt.Chart(hackney_wards).mark_geoshape( fill='lightgray', # 无填充 border='darkkgray', # 黑色描边 strokeWidth=1 # 描边宽度 ).encode( tooltip='NAME:N' # 将 'NAME' 替换为包含病房名称的列的实际名称 ).properties( 宽度=800, 高度=600 ).project( 类型='身份')

london_wards_map + hackney_layer

那为什么是颠倒的呢?

另一个问题。

我想在上面放第三层。

邮政编码_meals.crs = 4326 点 = alt.Chart(postcode_meals).mark_circle(color='#008751').encode( 经度='长:Q', 纬度='lat:Q', size=alt.Size('count:Q',scale=alt.Scale(domain=[postcode_meals['count'].min(),postcode_meals['count'].max()],range=[10, 1000 ])), # 根据需要调整范围 tooltip=['病区', '邮政编码', '计数', '长', '纬度'] ).properties(title='按邮政编码列出的优惠券地图')

text = alt.Chart(postcode_meals).mark_text(dy=-5).encode( 经度='长:Q', 纬度='lat:Q', text='邮政编码' )

将病区边界与点和文本相结合

积分

作为测试图,它看起来是正确的。

但是当我尝试将它们分层时......

不太确定如何诊断这里的投影问题

python geopandas altair
1个回答
0
投票

解决 Geopandas 和 Altair 中的上行绘图和投影问题我认为这是我已经发布并回答的问题的重复。

© www.soinside.com 2019 - 2024. All rights reserved.