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

时间:2019-04-27 17:50:58

标签: python pandas altair

我正在尝试使用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"]
)

enter image description here

但是当我尝试使用此代码来创建交互式内容时,它会失败:

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

有人可以帮我吗?

还可以使图例具有交互性吗?那么将鼠标悬停在一年上方会突出显示一行吗?

1 个答案:

答案 0 :(得分:1)

两个问题:

  • 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
)

enter image description here

由于选择不会改变z顺序,因此您会发现突出显示的行通常隐藏在其他灰线的后面。如果希望它弹出在前面,可以使用类似于https://stackoverflow.com/a/55796860/2937831

中的方法