【问题标题】:Altair adding date slider for interactive scatter chart potAltair 为交互式散点图添加日期滑块
【发布时间】:2020-05-27 15:32:13
【问题描述】:

有没有人尝试使用日期作为 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)

【问题讨论】:

    标签: python-3.x charts visualization scatter-plot altair


    【解决方案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 目前不提供任何本地方式来创建显示格式化日期的滑块。

    【讨论】:

      【解决方案2】:

      解决此问题的另一种方法是使用另一个图表代替滑块。这让您可以查看日期以及使用范围进行选择,这在目前使用滑块也是不可能的。

      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
      

      【讨论】:

        猜你喜欢
        • 2021-10-30
        • 2019-07-23
        • 1970-01-01
        • 2017-10-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-15
        相关资源
        最近更新 更多