Rendering Pipeline

Rendering Pipeline

How does the function call

df = dataset("ggplot2", "diamonds")
p = plot(df,
         x = :Price, color = :Cut,

actually get turned into the following plot?

Price 0 5.0×10³ 1.0×10⁴ 1.5×10⁴ 2.0×10⁴ Ideal Premium Good Very Good Fair Cut 0 1×10³ 2×10³ 3×10³ 4×10³

The rendering pipeline transforms a plot specification into a Compose scene graph that contains a set of guides (e.g. axis ticks, color keys) and one or more layers of geometry (e.g. points, lines). The specification of each layer has

All layers of a plot share the same

A full plot specification must describe these shared elements as well as all the layer specifications. In the example above, we see that only the data source, statistics, geometry, and mapping are specified. The missing elements are either inferred from the data (e.g. categorical values in df[:Cut] implies a discrete color scale), or assumed using defaults (e.g. continuous x-axis scale). For example, invoking plot with all the elements will look something like

p = plot(layer(df,
               x = :Price, color = :Cut,
		 Guide.xticks, Guide.yticks,

Once a full plot specification is filled out, the rendering process proceeds as follows:

  1. For each layer in the plot, we first map subsets of the data source to a Data object. The Price and Cut columns of the diamond dataset are mapped to the :x and :color fields of Data, respectively.

  2. Scales are applied to the data to obtain plottable aesthetics. Scale.x_continuous keeps the values of df[:Price] unchanged, while Scale.color_discrete_hue maps the unique elements of df[:Cut] (an array of strings) to actual color values.

  3. The aesthetics are transformed by layer-wise and plot-wise statistics, in order. Stat.histogram replaces the x field of the aesthetics with bin positions, and sets the y field with the corresponding counts.

  4. Using the position aesthetics from all layers, we create a Compose context with a coordinate system that fits the data to screen coordinates. Coord.cartesian creates a Compose context that maps a vertical distance of 3000 counts to about two inches in the rendered plot.

  5. Each layer renders its own geometry.

  6. Finally, we compute the layout of the guides and render them on top of the plot context.