The code below creates a regression line; however, the legend defaults to labeling the line as “undefined.” How can this regression line be labeled in the legend as “reg-line”?
JavaScript
x
29
29
1
import altair as alt
2
from vega_datasets import data
3
import pandas as pd
4
5
source = data.anscombe().copy()
6
source['line-label'] = 'x=y'
7
source = pd.concat([source,source.groupby('Series').agg(x_diff=('X','diff'), y_diff=('Y','diff'))],axis=1)
8
source['rate'] = source.y_diff/source.x_diff
9
source['rate-label'] = 'line y=x'
10
11
scatter = alt.Chart(source).mark_circle(size=60, opacity=0.60).encode(
12
x='X:Q',
13
y='Y:Q',
14
color='Series:N',
15
tooltip=['X','Y','rate']
16
)
17
18
scatter = scatter + scatter.transform_regression('X', 'Y').mark_line(opacity=0.50, shape='mark')
19
20
chart = scatter.facet(
21
columns=2
22
, facet=alt.Facet('Series',header=alt.Header(labelFontSize=25))
23
).resolve_scale(
24
x='independent',
25
y='independent'
26
)
27
28
chart.display()
29
Advertisement
Answer
Simply add .transform_fold(["reg-line"], as_=["Regression", "y"]).encode(alt.Color("Regression:N"))
after mark line
Code should look like
JavaScript
1
34
34
1
import altair as alt
2
from vega_datasets import data
3
import pandas as pd
4
5
source = data.anscombe().copy()
6
source['line-label'] = 'x=y'
7
source = pd.concat([source,source.groupby('Series').agg(x_diff=('X','diff'), y_diff=('Y','diff'))],axis=1)
8
source['rate'] = source.y_diff/source.x_diff
9
source['rate-label'] = 'line y=x'
10
11
scatter = alt.Chart(source).mark_circle(size=60, opacity=0.60).encode(
12
x='X:Q',
13
y='Y:Q',
14
color='Series:N',
15
tooltip=['X','Y','rate']
16
)
17
18
scatter = scatter + scatter.transform_regression('X', 'Y').mark_line(
19
opacity=0.50,
20
shape='mark'
21
).transform_fold(
22
["reg-line"],
23
as_=["Regression", "y"]
24
).encode(alt.Color("Regression:N"))
25
chart = scatter.facet(
26
columns=2
27
, facet=alt.Facet('Series',header=alt.Header(labelFontSize=25))
28
).resolve_scale(
29
x='independent',
30
y='independent'
31
)
32
33
chart.display()
34