{
const colors = {
domain: ['IllegalDumping', 'BuildingMaintenance', 'Electrical', 'StreetSweeping', 'RoadRepair','VegetationControl','Graffiti','Drainage','StreetLights','Survey'],
range: ['#A52A2A', '#228B22', '#1E90FF', '#FFA500', '#FFD700', 'A52A2A', '4B0082', 'B2222', '228B22', 'B0C4DE']
};
const shapes = {
domain: ['IllegalDumping', 'BuildingMaintenance', 'Electrical', 'StreetSweeping', 'RoadRepair','VegetationControl','Graffiti','Drainage','StreetLights','Survey'],
range: ['circle', 'square', 'square', 'triangle', 'circle', 'triangle', 'triangle', 'square', 'square', 'triangle']
};
const line = vl.markLine({strokeWidth: 3, opacity: 0.4, interpolate: 'monotone'}).encode(
vl.x().fieldO('Year').axis({labelAngle:'0'}),
vl.y().fieldQ('NumRequests'),
vl.color().fieldN('ProblemType').scale(colors).legend({orient: 'left'}),
).title({
text: 'By Year',
size: 20,
type: 'Tahoma',
});
const point = vl.markPoint({filled:true, size: 75}).encode(
vl.x().fieldO('Year'),
vl.y().fieldQ('NumRequests').title('Number of Requests'),
vl.color().fieldN('ProblemType').scale(colors),
vl.shape().fieldN('ProblemType').scale(shapes),
);
const linechart = vl.layer(line, point).height(660).width(250).data(stats);
const bar = vl.markBar().encode(
vl.x().fieldQ('NumRequests').title(null),
vl.y().fieldN('Year').title(null),
vl.row().fieldN('ProblemType'),
vl.color().fieldQ('Year').scale({scheme: 'greys'}).legend(null)
);
const txt = bar.markText({dx:15}).encode(
vl.text().fieldQ('NumRequests'),
vl.color("black")
);
const barchart = vl.layer(txt,bar).height(45).facet({row:vl.column('ProblemType')}).data(stats);
return vl.hconcat(linechart, barchart).render();
}