{
const lineGraphs =
vl
.markLine({strokeWidth: 4, opacity: 0.4, interpolate: 'monotone', point: { size: 100 }})
.data(stats)
.encode(
vl.x().fieldO('Year').axis({labelAngle: 0}),
vl.y().fieldQ('NumRequests').title('Number of Requests'),
vl.shape().fieldN('ProblemType').scale(shapeMapping).legend({orient: 'top-left'}),
vl.color().fieldN('ProblemType').scale(colorMapping).legend({orient: 'top-left'})
)
.width(300)
.height(600)
.title({text: 'By Year', fontSize: 16, font: "Tahoma" })
.resolve({legend: {orient: 'independent'}});
const bars1 = vl.markBar()
.encode(
vl.y().fieldO('Year').axis({labelAngle: 0, gridOpacity: 0.0}),
vl.x().fieldQ('NumSeeClickFix'),
vl.color({"value": "forestgreen"})
)
.height(40);
const bars2 = vl.markBar()
.encode(
vl.y().fieldO('Year').axis({labelAngle: 0, gridOpacity: 0.0, title: null}),
vl.x().fieldQ('NumSeeClickFix'),
vl.x2().field('NumRequests'),
vl.color().fieldQ('Year').legend(null).scale({ scheme: 'greys' })
)
.height(40);
const barText = vl.markText({"dx": 15})
.encode(
vl.x().fieldQ('NumRequests').stack(null),
vl.y().fieldO('Year'),
vl.text().fieldQ('NumRequests')
);
const groupedBars = vl.layer(bars1, bars2, barText)
.height(500)
.facet({row: vl.row('ProblemType').header({labelAngle: 0, labelAlign: "left", title: null, labelFontStyle: "bold", labelFontSize: 12}).sort(repairsInOrder)})
.title({text: 'By Problem Type', anchor: 'center', offset: 5, fontSize: 16, font: "Tahoma"})
.resolve({scale: {color: 'independent'}})
.data(stats)
.transform(vl.calculate('datum.NumRequests * (datum.ReportedBySeeClickFix*.01)').as('NumSeeClickFix'));
return vl
.hconcat(lineGraphs, groupedBars)
.title({
text: 'City of Springfield Service Request Statistics (2009-2012)',
dx: 150, dy: -10,fontSize: 20, font: "Tahoma"})
.render()
}