Altair折线图中的工具提示

时间:2018-11-13 19:07:59

标签: python altair

在为折线图指定工具提示时,仅当将鼠标悬停在沿线的点上时才会显示该工具提示,而当将鼠标悬停在沿线的任何其他位置时,则不会出现。当使用非线性插值时,这尤其成问题。是否可以在行本身上显式设置工具提示?

import altair as alt
from vega_datasets import data

source = data.jobs.url

alt.Chart(source).mark_line(interpolate="basis").encode(
    alt.X('year:O'),
    alt.Y('perc:Q', axis=alt.Axis(format='%')),
    color='sex:N',
    tooltip='sex:N'
).properties(
    title='Percent of work-force working as Welders'
).transform_filter(
    alt.datum.job == 'Welder'
)

enter image description here

2 个答案:

答案 0 :(得分:2)

我怀疑目前是否有直接的技术解决方案:-(

一种解决方法是在行顶部显式添加点,以便更轻松地进行悬停。我通常使它们相对较大,但是要一直隐藏直到发生悬停事件为止,例如here作为顶部的樱桃,就像在{{3}中所做的那样,可以使用Voronoi显示任意给定点的最近点。 }

让我知道您是否需要Altair代码示例,我使用了原始vega,但是实现Altair版本应该相对简单

答案 1 :(得分:1)

从@Philipp_Kats的回答和@dominik的评论(以及其他偶然发现此线程并希望看到Altair代码示例的人)的延伸,当前的实现“工具提示”效果的方法是:

  1. 创建行(mark_line()
  2. 创建一个选择最接近点的选择并基于x值进行选择
  3. 在行中捕捉一些透明的选择器,从而在行的不同位置通知x值
  4. 上方(1-3)上方的图层(mark_text()

一个真实的例子是line chart on a simple Flask app I made。唯一的区别是我没有使选择器透明(opacity=alt.value(0)),但否则它是折线图,上面贴有工具提示。

这是使用OP原始数据集的可重现示例:

# Step 1: create the line
line = alt.Chart().mark_line(interpolate="basis").encode(
    x=alt.X("year:O"),
    y=alt.Y("perc:Q", axis=alt.Axis(format='%')),
    color='sex:N'
).transform_filter(
    alt.datum.job == 'Welder'
)

# Step 2: Selection that chooses nearest point based on value on x-axis
nearest = alt.selection(type='single', nearest=True, on='mouseover',
                            fields=['year'])


# Step 3: Transparent selectors across the chart. This is what tells us
# the x-value of the cursor
selectors = alt.Chart().mark_point().encode(
    x="year:O",
    opacity=alt.value(0),
).add_selection(
    nearest
)

# Step 4: Add text, show values in Sex column when it's the nearest point to 
# mouseover, else show blank
text = line.mark_text(align='left', dx=3, dy=-3).encode(
    text=alt.condition(nearest, 'sex:N', alt.value(' '))
)

# Layer them all together
chart = alt.layer(line, selectors, text, data=source, width=300)

chart

结果图:

enter image description here