---
title: "Getting started with orbis"
output: rmarkdown::html_vignette
vignette: >
  %\VignetteIndexEntry{Getting started with orbis}
  %\VignetteEngine{knitr::rmarkdown}
  %\VignetteEncoding{UTF-8}
---

```{r, include = FALSE}
knitr::opts_chunk$set(collapse = TRUE, comment = "#>")
```

```{r setup}
library(orbis)
```

orbis describes a plot with a layered grammar, then compiles that description
to a scene of drawing primitives. Because the scene is resolution independent,
the same plot object can become an interactive figure in a browser or a 600 dpi
image for a journal, with nothing re-specified.

## The grammar

A plot starts with data and a mapping from variables to visual channels. Layers
are added with `+`.

```{r}
p <- orb(mtcars, x = wt, y = mpg, colour = hp, size = disp) +
  orb_points() +
  orb_labs(title = "Fuel economy", x = "Weight (1000 lbs)",
           y = "Miles per gallon", colour = "Horsepower")
p
```

Recognised channels are `x`, `y`, `colour` (or `color`), `fill`, `size`,
`label`, `group` and `tooltip`. A mapping given inside a layer applies to that
layer only.

Continuous variables mapped to colour use a perceptually uniform ramp;
character or factor variables get a qualitative palette and an interactive
legend.

```{r}
orb(mtcars, x = wt, y = mpg, colour = factor(cyl)) +
  orb_points() +
  orb_theme_dark()
```

## Layers

```{r}
set.seed(1)
df <- data.frame(t = 1:80, v = cumsum(rnorm(80, 0.05)))

orb(df, x = t, y = v) +
  orb_area(alpha = 0.3) +
  orb_line(width = 2, smooth = TRUE) +
  orb_labs(title = "A smoothed series")
```

`orb_bars()` accepts a discrete `x`:

```{r}
counts <- data.frame(g = c("alpha", "beta", "gamma", "delta"),
                     v = c(23, 41, 17, 35))
orb(counts, x = g, y = v, fill = g) +
  orb_bars() +
  orb_options(legend = FALSE, grid = "y") +
  orb_theme_ink()
```

## Small multiples

`orb_facet()` draws one panel per level of a variable. Panels share their scales
by default, which is what makes them comparable at a glance.

```{r}
orb(mtcars, x = wt, y = mpg, colour = hp) +
  orb_points() +
  orb_facet(cyl) +
  orb_labs(title = "By cylinder count", x = "Weight", y = "MPG")
```

Use `scales = "free"` (or `"free_x"`, `"free_y"`) when panels cover very
different ranges, and `ncol` to control the grid:

```{r}
set.seed(3)
d <- data.frame(t = rep(1:40, 3),
                v = c(cumsum(rnorm(40)), cumsum(rnorm(40, 0.3)),
                      cumsum(rnorm(40, -0.2))),
                region = rep(c("north", "south", "east"), each = 40))
orb(d, x = t, y = v) +
  orb_area(alpha = 0.3) + orb_line() +
  orb_facet(region, ncol = 3, scales = "free_y")
```

Colours and sizes are resolved across the whole data set rather than per panel,
so a colour means the same thing everywhere.

## Scales

Scales set palettes, limits and axis transformations.

```{r}
orb(mtcars, x = wt, y = mpg, colour = hp) +
  orb_points() +
  orb_scale_colour("magma", reverse = TRUE) +
  orb_scale_size(range = c(3, 16)) +
  orb_scale_y(limits = c(10, 35))
```

Available palettes:

```{r}
orb_palettes()
```

## Maps

A simplified world dataset ships with the package.

```{r}
str(world_map)
```

`orb_worldmap()` is the quickest way to a map. Supply `values` to shade regions
by a variable.

```{r}
vals <- data.frame(region = c("Brazil", "India", "France", "China", "Nigeria"),
                   v = c(3, 9, 5, 8, 6))
orb_worldmap(values = vals, value_col = "v", projection = "robinson") +
  orb_labs(title = "A small choropleth")
```

Six projections are built in. `equalearth` is a good modern default for
thematic maps: it is equal-area, so shaded country sizes are directly
comparable, while keeping continents close to their familiar shapes.

```{r}
orb_worldmap(values = vals, value_col = "v", projection = "equalearth",
             palette = "ice") +
  orb_labs(title = "Equal Earth")
```

The orthographic projection draws a globe and hides the hemisphere facing away
from the viewer.

```{r}
orb_worldmap(projection = "orthographic", ocean = "#0B1F33") +
  orb_coord_map("orthographic", centre = c(20, 15)) +
  orb_theme_dark()
```

Points are placed on the active projection with `orb_geo_points()`:

```{r}
cities <- data.frame(
  long = c(2.35, -74.0, 151.2, 77.2, -43.2),
  lat  = c(48.86, 40.7, -33.87, 28.6, -22.9),
  pop  = c(11, 19, 5, 32, 13)
)
orb(cities, x = long, y = lat, size = pop) +
  orb_map(fill = "#E9ECEF") +
  orb_geo_points(colour = "#F76707") +
  orb_coord_map("robinson") +
  orb_labs(title = "Cities")
```

## Output

One plot object, several destinations. The format follows the file extension.

```{r, eval = FALSE}
orb_save(p, "figure.png", dpi = 600)   # high-resolution raster for print
orb_save(p, "figure.pdf")              # vector
orb_save(p, "figure.svg")              # vector, still interactive
orb_save(p, "figure.html")             # self-contained interactive page
orb_interactive(p)                     # open in the viewer
```

Raster output is laid out at `width` x `height` logical pixels and then
rendered at the requested `dpi`, so a 300 or 600 dpi figure keeps the same
proportions as what you saw on screen.

The interactive output supports:

* hovering a mark for a tooltip,
* scrolling to zoom and dragging to pan,
* double-clicking to reset the view,
* clicking a legend key to hide or show that series.

Set `orb_options(interactive = FALSE)` if a document must not contain scripts.

## What orbis does not do yet

There are no statistical layers, so summarise data before plotting: there is no
smoother, boxplot or histogram geometry yet. Text is measured approximately
when laying out axes and legends, because the SVG writer does not query a font
engine, so very long labels can be spaced imperfectly. The bundled world map is
simplified for figure-sized output rather than for detailed cartography.
