Altair 中的世界地图 + 滑块 (Python)
World map + slider in Altair (Python)
我想在 python.
中使用 Altair 库构建一个带有世界地图的交互式图表,其中包含每个国家/地区的 COVID-19 确诊病例和日期滑块。
数据格式:
"country_region","date","confirmed_cases"
"Afghanistan",2020-01-22,0
"Afghanistan",2020-01-23,0
"Afghanistan",2020-01-24,0
"Afghanistan",2020-01-25,0
我已经成功构建了非交互式图表,但无法设置滑块。我的图表现在看起来像这样:
我想添加滑块以选择日期,但无法正确设置。
我使用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'
)
我想在 python.
中使用 Altair 库构建一个带有世界地图的交互式图表,其中包含每个国家/地区的 COVID-19 确诊病例和日期滑块。数据格式:
"country_region","date","confirmed_cases"
"Afghanistan",2020-01-22,0
"Afghanistan",2020-01-23,0
"Afghanistan",2020-01-24,0
"Afghanistan",2020-01-25,0
我已经成功构建了非交互式图表,但无法设置滑块。我的图表现在看起来像这样:
我想添加滑块以选择日期,但无法正确设置。
我使用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'
)