toSpec method

VlJson toSpec()

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;
}