有人尝试过使用日期作为Altair交互式散点图的滑块吗?
我正在尝试重现与gapminder散布相似的图: 1)我尝试使用日期而不是年份过滤器“ 2020-01-05”并出现以下错误:
altair.vegalite.v4.schema.core.BindRange->max, validating 'type'
'2020-05-17T00:00:00' is not of type 'number'
2)当我尝试将其解析为int时,图中未显示任何内容 3)使用“年”滑块的示例:https://www.datacamp.com/community/tutorials/altair-in-python https://altair-viz.github.io/gallery/multiple_interactions.html 4)时间戳选项也不理想,因为日期需要可读 将不胜感激。谢谢
#Date Slider
from altair import datum
from datetime import datetime
import altair as alt
import pandas as pd
import numpy as np
import datetime as dt
date_slider = alt.binding_range(min=min(df['date']), max=max(df['date']), step=1)
slider_selection = alt.selection_single(bind=date_slider, fields=['date'], name="Date", init={'week_starting': max(df[‘date’]})
alt.Chart(df).mark_point(filled=True).encode(
x='mom_pct',
y='yoy_pct',
size='n_queries',
color='vertical',
tooltip = ['vertical', 'yoy_pct', 'mom_pct']
).properties(
width=800,
height=600
).add_selection(slider_selection).transform_filter(slider_selection)
答案 0 :(得分:1)
Vega-Lite滑块不支持日期时间显示,但是可以显示时间戳。这是一个完整的示例(由于您未提供任何数据,因此我没有将其作为代码的基础):
import altair as alt
import pandas as pd
import numpy as np
from datetime import datetime
datelist = pd.date_range(datetime.today(), periods=100).tolist()
rand = np.random.RandomState(42)
df = pd.DataFrame({
'xval': datelist,
'yval': rand.randn(100).cumsum(),
})
def timestamp(t):
return pd.to_datetime(t).timestamp() * 1000
slider = alt.binding_range(name='cutoff:', min=timestamp(min(datelist)), max=timestamp(max(datelist)))
selector = alt.selection_single(name="SelectorName", fields=['cutoff'],
bind=slider,init={"cutoff": timestamp("2020-05-05")})
alt.Chart(df).mark_point().encode(
x='xval',
y='yval',
opacity=alt.condition(
'toDate(datum.xval) < SelectorName.cutoff[0]',
alt.value(1), alt.value(0)
)
).add_selection(
selector
)
不幸的是,Vega-Lite当前不提供任何本机方式来创建显示格式化日期的滑块。
答案 1 :(得分:0)
解决此问题的另一种方法是使用另一个图表代替滑块。这让您可以看到日期以及使用范围进行选择,而目前使用滑块也无法做到这一点。
import altair as alt
from vega_datasets import data
import pandas as pd
# Convert date column to an actual date and filter the data.
movies = (
data.movies()
.assign(Release_Date=lambda df: pd.to_datetime(df['Release_Date']))
.query('1960 < Release_Date < 2010')
.sample(1_000, random_state=90384))
select_year = alt.selection_interval(encodings=['x'])
bar_slider = alt.Chart(movies).mark_bar().encode(
x='year(Release_Date)',
y='count()').properties(height=50).add_selection(select_year)
scatter_plot = alt.Chart(movies).mark_circle().encode(
x='Rotten_Tomatoes_Rating',
y='IMDB_Rating',
opacity=alt.condition(
select_year,
alt.value(0.7), alt.value(0.1)))
scatter_plot & bar_slider