如何解决Altair中的世界地图+滑块Python
我想使用python中的altair库用世界地图构建带有COVID-19确定病例的世界地图的交互式图表,并使用日期滑块。
数据格式:
transform_lookup
我设法建立了非交互式图表,但无法设置滑块。我的图表现在看起来像这样:
我想添加滑块以选择日期,但是无法正确设置日期。
我使用transform_filter
方法根据数据(确诊病例/人口)向国家/地区添加颜色,据我所知,应将transform_lookup
添加到其中,以更改滑块位置,从而进行数据过滤用户。但这是行不通的。我的假设是,在transform_lookup
中始终使用原始数据,并且过滤在该处不起作用。我没有找到有关同时使用import requests
import json
import pandas as pd
import altair as alt
from vega_datasets import data
from altair import datum
df = pd.read_csv('https://raw.githubusercontent.com/MariaKokshaikina/any-data/main/covid19_global_confirmed_cases%20(1).csv')
country_info = requests.get(
'https://raw.githubusercontent.com/MariaKokshaikina/any-data/main/country_info.json'
).json()
df = df[df['country_region'].isin(country_info)]
df = df.sort_values('date',ascending=True)
df = df.tail(5000)
def timestamp(t):
return pd.to_datetime(t).timestamp() * 1000
df['id'] = df['country_region'].map(lambda x: country_info[x]['numericCode'])
df['rate'] = df['confirmed_cases'] / df['country_region'].map(lambda x: country_info[x]['population'])
df['timestamp'] = df['date'].map(timestamp)
countries = alt.topo_feature(data.world_110m.url,'countries')
slider = alt.binding_range(
step=24 * 60 * 60 * 1000,min=df['timestamp'].min(),max=df['timestamp'].max()
)
select_date = alt.selection_single(
name="slider",fields=['timestamp'],bind=slider,)
alt.Chart(countries).mark_geoshape()\
.encode(color='rate:Q')\
.add_selection(select_date)\
.transform_filter(select_date)\
.transform_lookup(
lookup='id',from_=alt.LookupData(df,key='id',fields=['rate'])
)\
.project('equirectangular')\
.properties(
width=500,height=300,title='Title'
)
和滑块的示例或文档。
很高兴听到任何想法可以帮助我解决这个问题。
代码:
.transform_filter(select_date)\
解决方法
问题似乎是在Vega中,查找转换不会根据选择动态地重新计算。您可以通过切换作为主要数据源的地址来解决此问题,以便所有时间戳都显示在最终的联接数据集中:
alt.Chart(df).mark_geoshape()\
.encode(color='rate:Q')\
.add_selection(select_date)\
.transform_filter(select_date)\
.transform_lookup(
lookup='id',from_=alt.LookupData(countries,key='id',fields=["type","properties","geometry"])
)\
.project('equirectangular')\
.properties(
width=500,height=300,title='Title'
)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。