Search code examples
pythonaltair

Remove legend for points in Altair


I'm following this example https://altair-viz.github.io/gallery/multiline_highlight.html, and added text points. My lines have both strokeDash and color.

import altair as alt
from vega_datasets import data

source = data.stocks()

highlight = alt.selection(type='single', on='mouseover',
                          fields=['symbol'], nearest=True)

base = alt.Chart(source).encode(
    x='date:T',
    y='price:Q',
    color='symbol:N',
    strokeDash='symbol:N'
)

points = base.mark_circle().encode(
    opacity=alt.value(0)
).add_selection(
    highlight
).properties(
    width=600
)

lines = base.mark_line().encode(
    size=alt.condition(~highlight, alt.value(1), alt.value(3))
)

points + lines

I'd like the legend to only show the dashed and colored lines, not the others (legend for text and points iiuc)

Is it possible to completely remove the extra legends from a chart?


Solution

  • It is enough to explicitly remove the legend on points and text by setting the color and strokeDash attributes

    import altair as alt
    from vega_datasets import data
    
    source = data.stocks()
    
    highlight = alt.selection(type='single', on='mouseover',
                              fields=['symbol'], nearest=True)
    
    base = alt.Chart(source).encode(
        x='date:T',
        y='price:Q',
        color='symbol:N',
        strokeDash='symbol:N'
    )
    
    points = base.mark_point().encode(
        opacity=alt.value(0),
        color=alt.Color('symbol:N', legend=None),
        strokeDash=alt.StrokeDash('symbol:N', legend=None)
    ).add_selection(
        highlight
    ).properties(
        width=600
    )
    
    lines = base.mark_line().encode(
        size=alt.condition(~highlight, alt.value(1), alt.value(3))
    )
    
    text = lines.mark_text(
        align='left',
        baseline='middle',
        dx=7
    ).encode(
        text='symbol',
        color=alt.Color('symbol:N', legend=None),
        strokeDash=alt.StrokeDash('symbol:N', legend=None)
    )
    
    (lines + points + text).resolve_scale(color='independent', strokeDash='independent')