Skip to contents

This function takes a Spec object as returned by ggsql_execute() and renders it with the provided writer.

Usage

ggsql_render(writer, spec)

Arguments

writer

A Writer object created by e.g. vegalite_writer().

spec

A Spec object returned by ggsql_execute().

Value

Writer dependent:

  • vegalite_writer: A string holding the vegalite JSON representation of the visualization

Examples

reader <- duckdb_reader()
ggsql_register(reader, mtcars, "cars")
spec <- ggsql_execute(reader,
  "SELECT * FROM cars VISUALISE mpg AS x DRAW histogram"
)

ggsql_render(vegalite_writer(), spec)
#> [1] "{\n  \"$schema\": \"https://vega.github.io/schema/vega-lite/v6.json\",\n  \"config\": {\n    \"axis\": {\n      \"domain\": false,\n      \"grid\": true,\n      \"gridColor\": \"#FFFFFF\",\n      \"gridWidth\": 1,\n      \"labelColor\": \"#4D4D4D\",\n      \"labelFontSize\": 12,\n      \"tickColor\": \"#333333\",\n      \"tickSize\": 4,\n      \"titleColor\": \"#000000\",\n      \"titleFontSize\": 15,\n      \"titleFontWeight\": \"normal\",\n      \"titlePadding\": 10\n    },\n    \"header\": {\n      \"labelColor\": \"#000000\",\n      \"labelFontSize\": 15,\n      \"labelFontWeight\": \"normal\",\n      \"labelPadding\": 5,\n      \"title\": null\n    },\n    \"legend\": {\n      \"labelColor\": \"#4D4D4D\",\n      \"labelFontSize\": 12,\n      \"rowPadding\": 6,\n      \"titleColor\": \"#000000\",\n      \"titleFontSize\": 15,\n      \"titleFontWeight\": \"normal\",\n      \"titlePadding\": 8\n    },\n    \"title\": {\n      \"anchor\": \"start\",\n      \"color\": \"#000000\",\n      \"fontSize\": 18,\n      \"fontWeight\": \"normal\",\n      \"frame\": \"group\",\n      \"offset\": 10,\n      \"subtitleColor\": \"#4D4D4D\",\n      \"subtitleFontSize\": 15,\n      \"subtitleFontWeight\": \"normal\"\n    },\n    \"view\": {\n      \"fill\": \"#EBEBEB\",\n      \"stroke\": null\n    }\n  },\n  \"data\": {\n    \"values\": [\n      {\n        \"__ggsql_aes_pos1__\": 9.9948275862,\n        \"__ggsql_aes_pos1end__\": 10.8051724138,\n        \"__ggsql_aes_pos2__\": 2.0,\n        \"__ggsql_aes_pos2end__\": 0.0,\n        \"__ggsql_row_index__\": 0,\n        \"__ggsql_source__\": \"__ggsql_layer_0__\"\n      },\n      {\n        \"__ggsql_aes_pos1__\": 13.2362068966,\n        \"__ggsql_aes_pos1end__\": 14.0465517242,\n        \"__ggsql_aes_pos2__\": 1.0,\n        \"__ggsql_aes_pos2end__\": 0.0,\n        \"__ggsql_row_index__\": 1,\n        \"__ggsql_source__\": \"__ggsql_layer_0__\"\n      },\n      {\n        \"__ggsql_aes_pos1__\": 14.046551724199999,\n        \"__ggsql_aes_pos1end__\": 14.856896551799998,\n        \"__ggsql_aes_pos2__\": 2.0,\n        \"__ggsql_aes_pos2end__\": 0.0,\n        \"__ggsql_row_index__\": 2,\n        \"__ggsql_source__\": \"__ggsql_layer_0__\"\n      },\n      {\n        \"__ggsql_aes_pos1__\": 14.8568965518,\n        \"__ggsql_aes_pos1end__\": 15.6672413794,\n        \"__ggsql_aes_pos2__\": 4.0,\n        \"__ggsql_aes_pos2end__\": 0.0,\n        \"__ggsql_row_index__\": 3,\n        \"__ggsql_source__\": \"__ggsql_layer_0__\"\n      },\n      {\n        \"__ggsql_aes_pos1__\": 15.667241379399998,\n        \"__ggsql_aes_pos1end__\": 16.477586206999998,\n        \"__ggsql_aes_pos2__\": 2.0,\n        \"__ggsql_aes_pos2end__\": 0.0,\n        \"__ggsql_row_index__\": 4,\n        \"__ggsql_source__\": \"__ggsql_layer_0__\"\n      },\n      {\n        \"__ggsql_aes_pos1__\": 17.287931034600003,\n        \"__ggsql_aes_pos1end__\": 18.098275862200005,\n        \"__ggsql_aes_pos2__\": 2.0,\n        \"__ggsql_aes_pos2end__\": 0.0,\n        \"__ggsql_row_index__\": 5,\n        \"__ggsql_source__\": \"__ggsql_layer_0__\"\n      },\n      {\n        \"__ggsql_aes_pos1__\": 18.0982758622,\n        \"__ggsql_aes_pos1end__\": 18.908620689800003,\n        \"__ggsql_aes_pos2__\": 2.0,\n        \"__ggsql_aes_pos2end__\": 0.0,\n        \"__ggsql_row_index__\": 6,\n        \"__ggsql_source__\": \"__ggsql_layer_0__\"\n      },\n      {\n        \"__ggsql_aes_pos1__\": 18.9086206898,\n        \"__ggsql_aes_pos1end__\": 19.7189655174,\n        \"__ggsql_aes_pos2__\": 3.0,\n        \"__ggsql_aes_pos2end__\": 0.0,\n        \"__ggsql_row_index__\": 7,\n        \"__ggsql_source__\": \"__ggsql_layer_0__\"\n      },\n      {\n        \"__ggsql_aes_pos1__\": 20.529310345000003,\n        \"__ggsql_aes_pos1end__\": 21.339655172600004,\n        \"__ggsql_aes_pos2__\": 2.0,\n        \"__ggsql_aes_pos2end__\": 0.0,\n        \"__ggsql_row_index__\": 8,\n        \"__ggsql_source__\": \"__ggsql_layer_0__\"\n      },\n      {\n        \"__ggsql_aes_pos1__\": 21.3396551726,\n        \"__ggsql_aes_pos1end__\": 22.150000000200002,\n        \"__ggsql_aes_pos2__\": 3.0,\n        \"__ggsql_aes_pos2end__\": 0.0,\n        \"__ggsql_row_index__\": 9,\n        \"__ggsql_source__\": \"__ggsql_layer_0__\"\n      },\n      {\n        \"__ggsql_aes_pos1__\": 22.150000000200002,\n        \"__ggsql_aes_pos1end__\": 22.960344827800004,\n        \"__ggsql_aes_pos2__\": 2.0,\n        \"__ggsql_aes_pos2end__\": 0.0,\n        \"__ggsql_row_index__\": 10,\n        \"__ggsql_source__\": \"__ggsql_layer_0__\"\n      },\n      {\n        \"__ggsql_aes_pos1__\": 23.770689655400002,\n        \"__ggsql_aes_pos1end__\": 24.581034483000003,\n        \"__ggsql_aes_pos2__\": 1.0,\n        \"__ggsql_aes_pos2end__\": 0.0,\n        \"__ggsql_row_index__\": 11,\n        \"__ggsql_source__\": \"__ggsql_layer_0__\"\n      },\n      {\n        \"__ggsql_aes_pos1__\": 25.3913793106,\n        \"__ggsql_aes_pos1end__\": 26.201724138200003,\n        \"__ggsql_aes_pos2__\": 1.0,\n        \"__ggsql_aes_pos2end__\": 0.0,\n        \"__ggsql_row_index__\": 12,\n        \"__ggsql_source__\": \"__ggsql_layer_0__\"\n      },\n      {\n        \"__ggsql_aes_pos1__\": 27.0120689658,\n        \"__ggsql_aes_pos1end__\": 27.822413793400003,\n        \"__ggsql_aes_pos2__\": 1.0,\n        \"__ggsql_aes_pos2end__\": 0.0,\n        \"__ggsql_row_index__\": 13,\n        \"__ggsql_source__\": \"__ggsql_layer_0__\"\n      },\n      {\n        \"__ggsql_aes_pos1__\": 30.2534482762,\n        \"__ggsql_aes_pos1end__\": 31.063793103800002,\n        \"__ggsql_aes_pos2__\": 2.0,\n        \"__ggsql_aes_pos2end__\": 0.0,\n        \"__ggsql_row_index__\": 14,\n        \"__ggsql_source__\": \"__ggsql_layer_0__\"\n      },\n      {\n        \"__ggsql_aes_pos1__\": 31.874137931400004,\n        \"__ggsql_aes_pos1end__\": 32.684482759000005,\n        \"__ggsql_aes_pos2__\": 1.0,\n        \"__ggsql_aes_pos2end__\": 0.0,\n        \"__ggsql_row_index__\": 15,\n        \"__ggsql_source__\": \"__ggsql_layer_0__\"\n      },\n      {\n        \"__ggsql_aes_pos1__\": 33.494827586599996,\n        \"__ggsql_aes_pos1end__\": 34.305172414199994,\n        \"__ggsql_aes_pos2__\": 1.0,\n        \"__ggsql_aes_pos2end__\": 0.0,\n        \"__ggsql_row_index__\": 16,\n        \"__ggsql_source__\": \"__ggsql_layer_0__\"\n      }\n    ]\n  },\n  \"height\": \"container\",\n  \"layer\": [\n    {\n      \"encoding\": {\n        \"fill\": {\n          \"value\": \"black\"\n        },\n        \"fillOpacity\": {\n          \"value\": 0.8\n        },\n        \"stroke\": {\n          \"value\": \"black\"\n        },\n        \"x\": {\n          \"axis\": {\n            \"labelExpr\": \"datum.label == '25' ? '25' : datum.label == '30' ? '30' : datum.label == '35' ? '35' : datum.label == '10' ? '10' : datum.label == '15' ? '15' : datum.label == '20' ? '20' : datum.label\",\n            \"values\": [\n              10.0,\n              15.0,\n              20.0,\n              25.0,\n              30.0,\n              35.0\n            ]\n          },\n          \"field\": \"__ggsql_aes_pos1__\",\n          \"scale\": {\n            \"domain\": [\n              8.779310344799999,\n              35.520689655599995\n            ],\n            \"zero\": false\n          },\n          \"title\": \"mpg\",\n          \"type\": \"quantitative\"\n        },\n        \"x2\": {\n          \"field\": \"__ggsql_aes_pos1end__\"\n        },\n        \"y\": {\n          \"axis\": {\n            \"labelExpr\": \"datum.label == '0' ? '0' : datum.label == '4' ? '4' : datum.label == '3' ? '3' : datum.label == '2' ? '2' : datum.label == '1' ? '1' : datum.label\",\n            \"values\": [\n              0.0,\n              1.0,\n              2.0,\n              3.0,\n              4.0\n            ]\n          },\n          \"field\": \"__ggsql_aes_pos2__\",\n          \"scale\": {\n            \"domain\": [\n              -0.2,\n              4.2\n            ],\n            \"zero\": false\n          },\n          \"stack\": null,\n          \"title\": \"count\",\n          \"type\": \"quantitative\"\n        },\n        \"y2\": {\n          \"field\": \"__ggsql_aes_pos2end__\"\n        }\n      },\n      \"mark\": {\n        \"clip\": true,\n        \"type\": \"bar\"\n      },\n      \"transform\": [\n        {\n          \"filter\": {\n            \"equal\": \"__ggsql_layer_0__\",\n            \"field\": \"__ggsql_source__\"\n          }\n        }\n      ]\n    }\n  ],\n  \"width\": \"container\"\n}"