vl.markBar()
.data(transition)
.transform(
vl.filter("datum.gender != 'P' && datum.kid_race != 'All'"),
vl.fold(['fraction_kfr_par_same', 'fraction_kfr_par_up', 'fraction_kfr_par_down'])
.as('transition_type', 'fraction'),
vl.calculate('datum.fraction * 100').as('percentage'),
vl.calculate("datum.transition_type === 'fraction_kfr_par_down' ? 'Downward' : datum.transition_type === 'fraction_kfr_par_same' ? 'Unchanged' : 'Upward'").as('type'),
vl.calculate("datum.gender === 'M' ? 'Male' : 'Female'").as('gender_name')
)
.encode(
vl.y().fieldN('kid_race').sort(vl.fieldN('fraction_kfr_par_up').order('descending')).title('Race of the Kids'),
vl.x().fieldQ('percentage').aggregate('sum').title('Proportion of Children (%)').scale({domain: [0, 100]}),
vl.yOffset().fieldN('gender').sort(['M', 'F']),
vl.color().fieldN('type').scale({range: ['#385C73', '#F2A35E', '#D94343']}).legend({
title: "Income Mobility"
}),
vl.opacity().fieldN('gender_name').scale({ domain: ['Male', 'Female'], range: [1, 0.6] }).legend({
title: 'Gender'
}),
vl.tooltip(
[{field: 'kid_race', type:'nominal', title: 'Race'},
{field: 'gender_name', type: 'nominal', title: 'Gender'},
{ field: 'type', type: 'nominal', title: 'Mobility Type'},
{ field: 'percentage', type: 'quantitative', format: '.2f', title: 'Percentage (%)' }])
)
.title('Income Mobility Patterns of Males and Females Among Different Races')
.width(600)
.height(300)
.render()