{
const other = vl.markLine({ opacity: 0.3 })
.data(data)
.encode(
vl.x()
.fieldO('month')
.sort({field: 'monthnum'})
.axis({title: 'Month'}),
vl.y()
.fieldQ('sunshine'),
vl.color()
.fieldN('city'),
vl.tooltip(['city', 'sunshine'])
)
.width(700);
const seattle = vl.markLine({ strokeWidth: 5 })
.data(data)
.transform(
vl.filter('datum.city == "Seattle"')
)
.encode(
vl.x().fieldO('month')
.sort({field: 'monthnum'})
,
vl.y().fieldQ('sunshine'),
vl.color().fieldN('city')
);
const points = vl.markPoint({ size: 120, filled: true })
.data(data)
.transform(
vl.joinaggregate({ op: 'min', field: 'sunshine', as: 'minSunshine' })
.groupby('month'),
vl.filter('datum.sunshine == datum.minSunshine')
)
.encode(
vl.x().fieldO('month').sort({field: 'monthnum'}),
vl.y().fieldQ('minSunshine').axis({title: 'Hours of Sunshine'}),
vl.color().fieldN('city')
);
return vl.layer(other, seattle, points).title({text: "A gloomy Seattle?", fontSize: 20}).render();
}