如何在 Altair 中突出显示多线图 python

How to highlight multiline graph in Altair python

我正在尝试使用 Python 中的 Altair 模块创建包含 20 多行数据的交互式时间序列图表。

创建我正在查看的形状的数据框的代码在这里:

import numpy as np
import altair as alt
year = np.arange(1995, 2020)
day = np.arange(1, 91)

def gen_next_number(previous, limit, max_reached):
    if max_reached:
        return np.NAN, True
    increment = np.random.randint(0, 10)
    output = previous + increment
    if output >= 100:
        output = 100
        max_reached = True
    return output, max_reached

def gen_list():
    output_list = []
    initial = 0
    limit = 100
    max_reached = False
    value = 0 
    for i in range(1, 91):
        value, max_reached = gen_next_number(value, limit, max_reached)
        if max_reached:
            value = np.NAN 
        output_list.append(value)
    return output_list

df = pd.DataFrame(index = day, columns=year )
for y in year:
    data = gen_list()
    df[y] = data

df['day'] = df.index
df = df.melt("day")
df = df.dropna(subset=["value"])

我可以使用以下 Altair 代码生成初始图,但它并不漂亮:

alt.Chart(df).mark_line().encode(
    x='day:N',
    color="variable:N",
    y='value:Q',
    tooltip=["variable:N", "value"]
)

但是当我尝试用这段代码创建一些交互式的东西时,它失败了:

highlight = alt.selection(type='single', on='mouseover',
                          fields='variable', nearest=True, empty="none")

alt.Chart(plottable).mark_line().encode(
    x='day:N',
    color="variable:N",
    y=alt.condition(highlight, 'value:Q', alt.value("lightgray")),
    tooltip=["variable:N", "value"]
).add_selection(
    highlight
)

失败并出现错误:

TypeError: sequence item 1: expected str instance, int found

有人可以帮我吗?

另外,是否可以让图例具有交互性?所以将鼠标悬停在一年上会突出显示一条线?

两期:

  • alt.condition中,您需要提供字段列表而不是单个字段
  • y 编码不接受条件。我怀疑你是想把条件放在颜色上。

通过这两个修复,您的图表可以正常工作:

highlight = alt.selection(type='single', on='mouseover',
                          fields=['variable'], nearest=True, empty="none")

alt.Chart(df).mark_line().encode(
    x='day:N',
    y='value:Q',
    color=alt.condition(highlight, 'variable:N', alt.value("lightgray")),
    tooltip=["variable:N", "value"]
).add_selection(
    highlight
)

因为选择不会改变 z 顺序,您会发现突出显示的线通常隐藏在其他灰色线后面。如果你想让它在前面弹出,你可以使用类似于

中的方法

我想创建一个类似于上面的多线图

  • 没有传说
  • 无需悬停或鼠标悬停。

只想传递一个 highlighted_value 并突出显示一行。

我修改了代码,因为我不太熟悉“选择”的正确用法,并且认识到获得我想要的结果有点笨拙。

有更简洁的方法吗?

highlight = alt.selection(type='single', on='mouseover',
                          fields=['variable'], nearest=True, empty="none")

background = alt.Chart(df[df['variable'] != 1995]).mark_line().encode(
    x='day:N',
    y='value:Q',
    color=alt.condition( highlight, 'variable:N', alt.value("lightgray")),
    tooltip=["variable:N", "value"],
).add_selection(
    highlight
)


foreground = alt.Chart(df[df['variable'] == 1995]).mark_line(color= "blue").encode(
    x='day:N',
    y='value:Q',
    color=alt.Color('variable',legend=None)
)
foreground + background