dashboard = {
const naus = vl.markCircle()
.data(df)
.encode(
vl.x().fieldQ('nausea').axis({grid:false}).title('Nausea Rating'),
vl.y().fieldQ('ride_length').title('Ride Length'),
vl.color().fieldQ('avg_speed').scale({scheme:'lightgreyteal'}).legend({orient:'left', titleOrient: 'left'})
.title('Average Speed')
)
.width(250)
.height(250);
const ints = vl.markCircle()
.data(df)
.encode(
vl.x().fieldQ('intensity').axis({grid:false}).title('Intensity Rating'),
vl.y().fieldQ('ride_length').title(null),
vl.color().fieldQ('avg_speed')
)
.width(250)
.height(250);
const exc = vl.markCircle()
.data(df)
.encode(
vl.x().fieldQ('excitement').axis({grid:false}).title('Excitement Rating'),
vl.y().fieldQ('ride_length').title(null),
vl.color().fieldQ('avg_speed')
)
.width(250)
.height(250);
const ratings_matrix = vl.markCircle()
.data(df)
.encode(
vl.x().fieldQ('intensity').axis({grid:false}).title('Intensity'),
vl.y().fieldQ('excitement').title('Excitement'),
vl.color().fieldN('nausea_rating').scale({scheme:'tableau20'}).title('Nausea Rating')
)
.width(250)
.height(250)
const speed = vl.data(df)
.transform({fold: ['avg_speed', 'max_speed']})
.encode(
vl.x().average('value').title('Speed').axis({grid:false}),
vl.y({sort:['Hypercoaster', 'Vertical Drop Coaster', 'Twister Coaster', 'Inverted Roller Coaster',
'Compact Inverted Coaster','Looping Roller Coaster','Wooden Roller Coaster ',
'Corkscrew Roller Coaster','Mini Roller Coaster','Spiral Coaster', 'Wooden Wild Mouse',
'Mine Train Coaster','Dinghy Slide','Stand Up Roller Coaster']})
.fieldN("rollercoaster_type").title('Rollercoaster Type'),
vl.color().scale({scheme:'lightgreyteal'}).fieldN('key').legend({orient:'right', title: 'Avg vs Max Speed'})
)
.layer(
vl.markBar()
.transform({filter: "datum.key == 'max_speed'"}),
vl.markBar()
.transform({filter: "datum.key == 'avg_speed'"})
)
.title({text:'Average vs Max Speed by Rollercoaster Type', anchor:'center', fontSize:16, offset: 20});
const colors = {
domain:['0', '1'],
range: ['#dc7b43','#c8bdb9']
};
const custSpeed = vl.markBar()
.data(df)
.encode(
vl.x().average('avg_speed').axis({grid:false}).title('Avg Speed'),
vl.y().fieldN('custom_design').title(null),
vl.color().fieldN('custom_design').scale(colors).legend({orient: 'right', title: 'Custom Design'})
);
const custExcitement = vl.markBar()
.data(df)
.encode(
vl.x().average('excitement').axis({grid:false}).title('Excitement'),
vl.y().fieldN('custom_design').axis({title:'Custom Design', fontSize:20}),
vl.color().fieldN('custom_design').scale(colors)
);
const custIntensity = vl.markBar()
.data(df)
.encode(
vl.x().average('intensity').axis({grid:false}).title('Intensity'),
vl.y().fieldN('custom_design').title(null),
vl.color().fieldN('custom_design').scale(colors)
);
return vl.vconcat(
ratings_matrix.title({
text: 'Relationship Between Excitement, Intensity, and Nausea',
anchor: 'middle',fontSize:16}
),
vl.hconcat(naus, ints, exc).title({
text: 'Nausea, Intensity, and Excitement by Ride Length and Average Speed',
anchor: 'middle',fontSize:16}),
speed,
vl.vconcat(custSpeed, custExcitement, custIntensity)
.title({text: 'Differences Between Custom and Non-Custom Rollercoaster Design',
fontSize:16, offset: 20})).config({style:{cell:{stroke:'transparent'}}}).render()
}