Как выделить многострочный граф в Python Altair - PullRequest
0 голосов
/ 27 апреля 2019

Я пытаюсь создать интерактивную диаграмму временных рядов с более чем 20 строками данных, используя модуль Altair в Python.

Код для создания кадра данных формы, которую я просматриваю, находится здесь:

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"])

Я могу использовать следующий код Альтаира для создания начального графика, но это не очень красиво:

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 Ответ

1 голос
/ 27 апреля 2019

Два выпуска:

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

...