{
const label = vl.markPoint({filled: true})
.data(df)
.transform(
vl.groupby('rollercoaster_type')
.aggregate(vl.average('excitement').as('Average Excitement'),
vl.average('intensity').as('Average Intensity'))
)
.mark({type: "text", fontSize: 10, dy: -10, dx: 5})
.encode(
vl.x().fieldQ('Average Excitement'),
vl.y().fieldQ('Average Intensity'),
vl.color().fieldN('rollercoaster_type').scale({scheme: 'category20b'})
.legend('rollercoaster_type'),
vl.text({field: "rollercoaster_type", type: "nominal"})
)
const point = vl.markPoint({filled: true, opacity: 0.5, size: 60})
.data(df)
.transform(
vl.groupby('rollercoaster_type')
.aggregate(vl.average('excitement').as('Average Excitement'),
vl.average('intensity').as('Average Intensity'))
)
.encode(
vl.x().fieldQ('Average Excitement'),
vl.y().fieldQ('Average Intensity'),
vl.color().fieldN('rollercoaster_type').scale({scheme: 'tableau20'})
.legend('rollercoaster_type')
.title('Rollercoaster Type'),
vl.text({field: "rollercoaster_type", type: "nominal"})
)
return vl.layer(point)
.title('Correlation between average Intensity and Excitement rates for different Rollercoaster types')
.width(500)
.height(500)
.render()
}