Вывести на передний план одиночный выбор в многострочном графике - PullRequest
0 голосов
/ 28 августа 2018

Я строю многострочный график, используя один селектор, чтобы выделить линию. Проблема в том, что когда я выбираю одну строку, а другие перекрашиваются, выбранная строка скрывается под некоторыми другими строками, в то время как я хотел бы, чтобы она была на переднем плане, чтобы быть полностью видимой. Я мог бы использовать alt.value('transparent'), но это просто заставило бы исчезнуть все остальные строки, вместо этого я хотел бы, чтобы они были все еще видны и на заднем плане. Есть ли способ сделать эту работу?

В моем примере ниже у меня есть 10 строк, и кажется, что vega-lite строит первую строку A, а затем над ней строку B, до линии L. Поэтому только последний столбец в DataFrame, строка L, полностью видимый, если выбран.

Заранее благодарю за помощь!

Вот код для воспроизведения диаграммы:

import pandas as pd
import numpy as np
import altair as alt

#Dataframe creation
df = pd.DataFrame(np.random.rand(15,10)+10, 
                  index=np.arange(2001,2016),
                  columns=list('ABCDEFGHIL'))
df = df.reset_index()
df = df.melt(id_vars='index')

#chart creation
selection = alt.selection(type='single', fields=['variable'])
color = alt.condition(selection,
                  alt.Color('variable:N', legend=None),
                  alt.value('lightblue'))

line = alt.Chart(df).mark_line().encode(
    y = 'value',
    x = 'index:O',
    color = color,
    tooltip = 'variable:N'
).add_selection(
    selection
).properties(
    width=400
)

legend = alt.Chart(df).mark_point().encode(
    x='variable:N',
    color=color
).add_selection(
    selection
).properties(
    width=400
)

line & legend

1 Ответ

0 голосов
/ 28 августа 2018

Вы не можете использовать выделение, чтобы изменить z-порядок линий, но вы можете использовать трюк со слоями, чтобы получить тот же эффект, создав еще один слой линий, отфильтрованный по выделению из первого.

import numpy as np
import pandas as pd
import altair as alt

#Dataframe creation
df = pd.DataFrame(np.random.rand(15,10)+10, 
                  index=np.arange(2001,2016),
                  columns=list('ABCDEFGHIL'))
df = df.reset_index()
df = df.melt(id_vars='index')

#chart creation
selection = alt.selection(type='single', fields=['variable'])
color = alt.condition(selection,
                  alt.Color('variable:N', legend=None),
                  alt.value('lightblue'))

line = alt.Chart(df).mark_line().encode(
    y = 'value',
    x = 'index:O',
    color = alt.value('lightblue'),
    detail = 'variable:N',
    tooltip = 'variable:N'
).add_selection(
    selection
).properties(
    width=400
)

# layer that accomplishes the highlighting
line_highlight = alt.Chart(df).mark_line().encode(
    y = 'value',
    x = 'index:O',
    color = 'variable:N',
).transform_filter(
    selection
).properties(
    width=400
)

legend = alt.Chart(df).mark_point().encode(
    x='variable:N',
    color=color
).add_selection(
    selection
).properties(
    width=400
)

(line + line_highlight) & legend
...