Reputation: 10203
Stealing this example, is there any way to selectively suppress some of the elements in the color legend, e.g. to show the legend for the colors in the line but not the band?:
df = pd.DataFrame(data={'col1': [1, 2,4,5,6], 'col2': [3, 4,7,4,4], 'col3': [1.5, 2.6,4.6,5.6,6.6], 'col4': [3.6, 4.6,7.6,4.6,4.4],'col5': [1.9, 2.9,4.9,5.9,6.9], 'col4': [3.9, 4.9,7.9,4.9,4.9]})
base = alt.Chart(df).transform_calculate(
line="'line'",
shade1="'shade1'",
shade2="'shade2'",
)
scale = alt.Scale(domain=["line", "shade1", "shade2"], range=['red', 'lightblue', 'darkblue'])
line = base.mark_line(color='purple').encode(
x=alt.X('col1', title='Day'),
y=alt.Y('col2', title='Column 2'),
color=alt.Color('line:N', scale=scale, title=''),
)
band_90 = base.mark_area(opacity=0.3, color='purple').encode(
x=alt.X('col1', title='Day'),
y='col3',
y2='col4',
color=alt.Color('shade1:N', scale=scale, title='')
)
alt.layer(
line+band_90
)
Upvotes: 2
Views: 803
Reputation: 49054
You can set the legend of the band to None
and then use an individual colorscale in the combined plot to make sure the line plot legend shows up:
df = pd.DataFrame(data={'col1': [1, 2,4,5,6], 'col2': [3, 4,7,4,4], 'col3': [1.5, 2.6,4.6,5.6,6.6], 'col4': [3.6, 4.6,7.6,4.6,4.4],'col5': [1.9, 2.9,4.9,5.9,6.9], 'col4': [3.9, 4.9,7.9,4.9,4.9]})
base = alt.Chart(df).transform_calculate(
line="'line'",
shade1="'shade1'",
shade2="'shade2'",
)
scale = alt.Scale(domain=["line", "shade1", "shade2"], range=['red', 'lightblue', 'darkblue'])
line = base.mark_line(color='purple').encode(
x=alt.X('col1', title='Day'),
y=alt.Y('col2', title='Column 2'),
color=alt.Color('line:N', scale=scale, title=''),
)
band_90 = base.mark_area(opacity=0.3, color='purple').encode(
x=alt.X('col1', title='Day'),
y='col3',
y2='col4',
color=alt.Color('shade1:N', scale=scale, title='', legend=None)
)
(line+band_90).resolve_scale(color='independent')
If you want to remove the legend entries for the band marker altogether you need to change scale to not include the "shade" groups in both plots:
base = alt.Chart(df).transform_calculate(
line="'line'",
shade1="'shade1'",
shade2="'shade2'",
)
line = base.mark_line(color='purple').encode(
x=alt.X('col1', title='Day'),
y=alt.Y('col2', title='Column 2'),
color=alt.Color('line:N', scale=alt.Scale(range=['red']), title=''),
)
band_90 = base.mark_area(opacity=0.3, color='purple').encode(
x=alt.X('col1', title='Day'),
y='col3',
y2='col4',
color=alt.Color('shade1:N', scale=alt.Scale(range=['lightblue']), title='', legend=None)
)
(line+band_90).resolve_scale(color='independent')
Upvotes: 2