I would like to have multiple selections in a multi-layer chart. One selection should highlight the closest line and the other should highlight the point on each line closest to the current x position of the mouse.
I can achieve this separately as shown below.
Highlight line:
<code>select = alt.selection_point(encodings=['x'], on='mouseover', nearest=True)
line_select = alt.selection_point(fields=['symbol'], nearest=True, on='mouseover')
base = alt.Chart(data.stocks.url).encode(color='symbol:N', x='date:T', y='price:Q')
selected_lines = base.mark_point(opacity=0).add_params(line_select)
line = base.mark_line().encode(
strokeWidth=alt.condition(line_select, alt.value(3), alt.value(1))
)
(
line
+ selected_lines
)
</code>
<code>select = alt.selection_point(encodings=['x'], on='mouseover', nearest=True)
line_select = alt.selection_point(fields=['symbol'], nearest=True, on='mouseover')
base = alt.Chart(data.stocks.url).encode(color='symbol:N', x='date:T', y='price:Q')
selected_lines = base.mark_point(opacity=0).add_params(line_select)
line = base.mark_line().encode(
strokeWidth=alt.condition(line_select, alt.value(3), alt.value(1))
)
(
line
+ selected_lines
)
</code>
select = alt.selection_point(encodings=['x'], on='mouseover', nearest=True)
line_select = alt.selection_point(fields=['symbol'], nearest=True, on='mouseover')
base = alt.Chart(data.stocks.url).encode(color='symbol:N', x='date:T', y='price:Q')
selected_lines = base.mark_point(opacity=0).add_params(line_select)
line = base.mark_line().encode(
strokeWidth=alt.condition(line_select, alt.value(3), alt.value(1))
)
(
line
+ selected_lines
)
Highlight points:
<code>select = alt.selection_point(encodings=['x'], on='mouseover', nearest=True)
base = alt.Chart(data.stocks.url).encode(color='symbol:N', x='date:T', y='price:Q')
line = base.mark_line().encode(
)
marks = base.mark_point(fill='black', strokeWidth=0).encode(
opacity=alt.condition(select, alt.value(1), alt.value(0)),
).add_params(select)
(
line
+ marks
)
</code>
<code>select = alt.selection_point(encodings=['x'], on='mouseover', nearest=True)
base = alt.Chart(data.stocks.url).encode(color='symbol:N', x='date:T', y='price:Q')
line = base.mark_line().encode(
)
marks = base.mark_point(fill='black', strokeWidth=0).encode(
opacity=alt.condition(select, alt.value(1), alt.value(0)),
).add_params(select)
(
line
+ marks
)
</code>
select = alt.selection_point(encodings=['x'], on='mouseover', nearest=True)
base = alt.Chart(data.stocks.url).encode(color='symbol:N', x='date:T', y='price:Q')
line = base.mark_line().encode(
)
marks = base.mark_point(fill='black', strokeWidth=0).encode(
opacity=alt.condition(select, alt.value(1), alt.value(0)),
).add_params(select)
(
line
+ marks
)
However, if I try to combine them the point selection stops working and only the line selection applies.
<code>select = alt.selection_point(encodings=['x'], on='mouseover', nearest=True)
line_select = alt.selection_point(fields=['symbol'], nearest=True, on='mouseover')
base = alt.Chart(data.stocks.url).encode(color='symbol:N', x='date:T', y='price:Q')
selected_lines = base.mark_point(opacity=0).add_params(line_select)
line = base.mark_line().encode(
strokeWidth=alt.condition(line_select, alt.value(3), alt.value(1))
)
marks = base.mark_point(fill='black', strokeWidth=0).encode(
opacity=alt.condition(select, alt.value(1), alt.value(0)),
).add_params(select)
(
line
+ selected_lines
+ marks
)
</code>
<code>select = alt.selection_point(encodings=['x'], on='mouseover', nearest=True)
line_select = alt.selection_point(fields=['symbol'], nearest=True, on='mouseover')
base = alt.Chart(data.stocks.url).encode(color='symbol:N', x='date:T', y='price:Q')
selected_lines = base.mark_point(opacity=0).add_params(line_select)
line = base.mark_line().encode(
strokeWidth=alt.condition(line_select, alt.value(3), alt.value(1))
)
marks = base.mark_point(fill='black', strokeWidth=0).encode(
opacity=alt.condition(select, alt.value(1), alt.value(0)),
).add_params(select)
(
line
+ selected_lines
+ marks
)
</code>
select = alt.selection_point(encodings=['x'], on='mouseover', nearest=True)
line_select = alt.selection_point(fields=['symbol'], nearest=True, on='mouseover')
base = alt.Chart(data.stocks.url).encode(color='symbol:N', x='date:T', y='price:Q')
selected_lines = base.mark_point(opacity=0).add_params(line_select)
line = base.mark_line().encode(
strokeWidth=alt.condition(line_select, alt.value(3), alt.value(1))
)
marks = base.mark_point(fill='black', strokeWidth=0).encode(
opacity=alt.condition(select, alt.value(1), alt.value(0)),
).add_params(select)
(
line
+ selected_lines
+ marks
)