toSpec method
The chart as a Vega-Lite specification.
One mark comes out as a plain specification; several come out as layers, each carrying the shared channels in full — a specification that states everything is one the compiler already handles and one a person can read in a diff.
May be called more than once. Check errors afterwards: a chart that names a
column its data does not have is reported here, where Vega-Lite would have
drawn an empty axis and said nothing.
Returns A Vega-Lite specification, ready for VlCompile.
VlDataset data = VlDataset.create();
data.row().str("region", "North").num("sales", 120.0);
data.row().str("region", "South").num("sales", 93.0);
VlChart chart = VlChart.create(data);
chart.size(300, 200);
chart.bar().x("region").y("sales").aggregate("sum");
chart.toSpec();
Implementation
VlJson toSpec() {
VlJson out = VlJson.objectValue();
for ( int ki = 0; ki < this.props.keys.length; ki++) {
var k = this.props.keys[ki];
out.setMember(k, props._get(k));
}
out.setMember("data", this.data!.toValues());
if ( transforms.count() > 0 ) {
out.setMember("transform", transforms);
}
int markCount = marks.length;
if ( markCount == 0 ) {
this.error("the chart has no marks");
return out;
}
if ( markCount == 1 ) {
VlChartMark only = marks[0];
out.setMember("mark", VlChart.markValue(only));
out.setMember("encoding", this.mergedEncoding(only));
} else {
VlJson layers = VlJson.arrayValue();
for ( final m in marks) {
VlJson layer = VlJson.objectValue();
layer.setMember("mark", VlChart.markValue(m));
layer.setMember("encoding", this.mergedEncoding(m));
layers.arr.add(layer);
}
out.setMember("layer", layers);
int resolveCount = this.resolve.keys.length;
if ( resolveCount > 0 ) {
out.setMember("resolve", resolve);
}
}
int cfgCount = this.cfg.keys.length;
if ( cfgCount > 0 ) {
out.setMember("config", cfg);
}
return out;
}