向 Altair 中的 Choropleth带滑块添加动态工具提示和标题

如何解决向 Altair 中的 Choropleth带滑块添加动态工具提示和标题

previous post 中,@jakevdp 在 altair 使用滑块(为方便起见粘贴在下方):

import altair as alt
import pandas as pd
from vega_datasets import data

us_counties = alt.topo_feature(data.us_10m.url,'counties')
fdf = pd.read_csv('https://raw.githubusercontent.com/sdaSara95/Opioid-Crisis/master/sample_data.csv')
fdf['year'] = fdf['year'].astype(str)
fdf = fdf.pivot(index='fips',columns='year',values='Pill_per_pop').reset_index()
columns = [str(year) for year in range(2006,2013)]

slider = alt.binding_range(min=2006,max=2012,step=1)
select_year = alt.selection_single(name="year",fields=['year'],bind=slider,init={'year': 2006})

alt.Chart(us_counties).mark_geoshape(
    stroke='black',strokeWidth=0.05
).project(
    type='albersUsa'
).transform_lookup(
    lookup='id',from_=alt.LookupData(fdf,'fips',columns)
).transform_fold(
    columns,as_=['year','Pill_per_pop']
).transform_calculate(
    year='parseInt(datum.year)',Pill_per_pop='isValid(datum.Pill_per_pop) ? datum.Pill_per_pop : -1'  
).encode(
    color = alt.condition(
        'datum.Pill_per_pop > 0',alt.Color('Pill_per_pop:Q',scale=alt.Scale(scheme='blues')),alt.value('#dbe9f6')
    )).add_selection(
    select_year
).properties(
    width=700,height=400
).transform_filter(
    select_year
)

我是 altair 的新手,想了解如何进行一些修改 到这个情节:

  1. 我们如何为该图添加随滑块值变化的标题 即“{slider_value_here} 年的药丸数量”?
  2. 如何将滑块标签更改为自定义yr 而不是当前的 year_year 值?
  3. 我们如何为每个县添加悬停工具提示,即 fips 值,如下所示 值,{year:{slider_year_value},fips:{fips_code_value_on_hover},number_pills:{Pill_per_pop}}?
  4. 我们如何向这个滑块添加动画小部件,例如有一个自动改变滑块值的播放按钮(可以在代码中控制时间)?

任何有关修改代码的帮助都会非常有帮助。我确实尝试过 在不同的地方插入 tooltip 以使查询 3 工作,但无法做到 发生。

感谢任何帮助

解决方法

感谢您提供清晰且可重现的示例!只是提醒一下未来,将您的要点分解成单独的问题可能是个好主意,这样其他人在搜索时更容易找到它们。我不相信你想要的一切目前都可以在 Altair/Vegalite 中实现,但这是我最好的回答:

  1. 我们如何为该图添加随滑块值变化的标题,即“{slider_value_here} 年的药丸数量”?

    我找到了 this comment mentioning that this is not possible for axis titles,所以我相信图表标题也不可能(虽然不确定)。另一种方法是插入一个小图表而不是标题并使用 mark_text 更新年份,similar to this example

  2. 我们如何将滑块标签更改为自定义为 yr 而不是当前的 year_year 值?

    binding_range 代替 selection_single 中设置 name 参数,例如slider = alt.binding_range(name='yr ',min=2006,max=2012,step=1)(名称旁边没有滑块的额外空间。

  3. 我们如何为每个县添加悬停工具提示,即 fips 值,具有以下值,{year:{slider_year_value},fips:{fips_code_value_on_hover},number_pills:{Pill_per_pop}}?

    首先更改查找以获取 fips 列:

     from_=alt.LookupData(fdf,'fips',columns + ['fips'])
    

    然后将一个列表传递给工具提示,指示列类型,因为它们来自查找并且不在您传递给图表的主数据框中。

     tooltip=['year:O','fips:Q','Pill_per_pop:Q']
    
  4. 我们如何向此滑块添加动画小部件,例如有一个自动改变滑块值的播放按钮(可以在代码中控制时间)?

    Animations are not yet supported in vegalite

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?