Author: Victor Perrier
Date: 2023-09-29

# billboarder

#### Victor Perrier

#### 2023-09-29

In the following we’ll use the insight theme (3 others are available: billboard (default), graph and datalab) and ColorBrewer Set2 as default color palette.

    set_theme("graph")
    set_color_palette(scales::brewer_pal(palette = "Set1")(9))

## Bar chart

Create barcharts with `bb_barchart` :

    library(billboarder)

    # data
    data("prod_par_filiere")

    billboarder(data = prod_par_filiere) %>%
      bb_barchart(
        mapping = aes(x = annee, y = prod_hydraulique),
        color = "#102246"
      ) %>%
      bb_y_grid(show = TRUE) %>%
      bb_y_axis(
        tick = list(format = suffix("TWh")),
        label = list(text = "production (in terawatt-hours)", position = "outer-top")
      ) %>%
      bb_legend(show = FALSE) %>%
      bb_labs(
        title = "French hydraulic production",
        caption = "Data source: RTE (https://opendata.rte-france.com)"
      )

To create a dodge barchart, if your data are in “wide” format, you can use the following (otherwise you have to reshape your data in “long” format, with tools such as `pivot_longer`):

    library(billboarder)

    # data
    data("prod_par_filiere")

    billboarder() %>%
      bb_barchart(
        data = prod_par_filiere[, c("annee", "prod_hydraulique", "prod_eolien", "prod_solaire")]
      ) %>%
      bb_data(
        names = list(prod_hydraulique = "Hydraulic", prod_eolien = "Wind", prod_solaire = "Solar")
      ) %>%
      bb_y_grid(show = TRUE) %>%
        bb_y_axis(
        tick = list(format = suffix("TWh")),
        label = list(text = "production (in terawatt-hours)", position = "outer-top")
      ) %>%
      bb_legend(position = "inset", inset = list(anchor = "top-right")) %>%
      bb_labs(
        title = "Renewable energy production",
        caption = "Data source: RTE (https://opendata.rte-france.com)"
      )

Same principle for stacked bar charts :

    library(billboarder)

    # data
    data("prod_par_filiere")

    # stacked bar chart !
    billboarder() %>%
      bb_barchart(
        data = prod_par_filiere[, c("annee", "prod_hydraulique", "prod_eolien", "prod_solaire")],
        stacked = TRUE
      ) %>%
      bb_data(
        names = list(prod_hydraulique = "Hydraulic", prod_eolien = "Wind", prod_solaire = "Solar"),
        labels = TRUE
      ) %>%
      bb_colors_manual(
        "prod_eolien" = "#41AB5D", "prod_hydraulique" = "#4292C6", "prod_solaire" = "#FEB24C"
      ) %>%
      bb_y_grid(show = TRUE) %>%
        bb_y_axis(
        tick = list(format = suffix("TWh")),
        label = list(text = "production (in terawatt-hours)", position = "outer-top")
      ) %>%
      bb_legend(position = "inset", inset = list(anchor = "top-right")) %>%
      bb_labs(
        title = "Renewable energy production",
        caption = "Data source: RTE (https://opendata.rte-france.com)"
      )

## Scatter plot

A classic one:

    billboarder() %>%
     bb_scatterplot(
       data = mtcars,
       x = "wt", y = "mpg", group = "cyl",
       point_opacity = 1
     ) %>%
      # don't display all values on x-axis
     bb_axis(x = list(tick = list(fit = FALSE))) %>%
     bb_point(r = 5) %>%
      # add grids
      bb_x_grid(show = TRUE) %>%
      bb_y_grid(show = TRUE)

You can make a bubble chart using `size` aes :

    billboarder(data = mtcars) %>%
      bb_scatterplot(
       mapping = aes(wt, mpg, group = cyl, size = scales::rescale(qsec, to = c(0.2, 7))),
       point_opacity = 1
      ) %>%
      bb_axis(x = list(tick = list(fit = FALSE))) %>%
      bb_x_grid(show = TRUE) %>%
      bb_y_grid(show = TRUE)

## Pie charts

Create pie charts :

    library(billboarder)

    # data
    data("prod_par_filiere")
    nuclear2016 <- data.frame(
      sources = c("Nuclear", "Other"),
      production = c(
        prod_par_filiere$prod_nucleaire[prod_par_filiere$annee == "2016"],
        prod_par_filiere$prod_total[prod_par_filiere$annee == "2016"] -
          prod_par_filiere$prod_nucleaire[prod_par_filiere$annee == "2016"]
      )
    )

    # pie chart !
    billboarder() %>%
      bb_piechart(data = nuclear2016) %>%
      bb_labs(title = "Share of nuclear power in France in 2016",
              caption = "Data source: RTE (https://opendata.rte-france.com)")

You can also do donut charts :

    billboarder() %>%
      bb_donutchart(data = nuclear2016) %>%
      bb_donut(
        title = "Share of nuclear\nin France",
        label = list(
          format = JS("function(value, ratio, id) { return id + ': ' + d3.format('.0%')(ratio);}")
        )
      ) %>%
      bb_legend(show = FALSE) %>%
      bb_labs(caption = "Data source: RTE (https://opendata.rte-france.com)")

## Lines charts

### Time serie with `Date` (and a subchart)

    library(billboarder)

    # data
    data("equilibre_mensuel")

    # line chart
    billboarder() %>%
      bb_linechart(
        data = equilibre_mensuel[, c("date", "consommation", "production")],
        type = "spline"
      ) %>%
      bb_x_axis(tick = list(format = "%Y-%m", fit = FALSE)) %>%
      bb_x_grid(show = TRUE) %>%
      bb_y_grid(show = TRUE) %>%
      bb_colors_manual("consommation" = "firebrick", "production" = "forestgreen") %>%
      bb_legend(position = "right") %>%
      bb_subchart(show = TRUE, size = list(height = 30)) %>%
      bb_labs(title = "Monthly electricity consumption and production in France (2007 - 2017)",
              y = "In megawatt (MW)",
              caption = "Data source: RTE (https://opendata.rte-france.com)")

### Zoom by dragging

    billboarder() %>%
      bb_linechart(
        data = equilibre_mensuel[, c("date", "consommation", "production")],
        type = "spline"
      ) %>%
      bb_x_axis(tick = list(format = "%Y-%m", fit = FALSE)) %>%
      bb_x_grid(show = TRUE) %>%
      bb_y_grid(show = TRUE) %>%
      bb_colors_manual("consommation" = "firebrick", "production" = "forestgreen") %>%
      bb_legend(position = "right") %>%
      bb_zoom(
        enabled = TRUE,
        type = "drag",
        resetButton = list(text = "Unzoom")
      ) %>%
      bb_labs(title = "Monthly electricity consumption and production in France (2007 - 2017)",
              y = "In megawatt (MW)",
              caption = "Data source: RTE (https://opendata.rte-france.com)")

### Time serie with `POSIXct` (and regions)

    library(billboarder)

    # data
    data("cdc_prod_filiere")

    # Retrieve sunrise and and sunset data with `suncalc`
    # library("suncalc")
    # sun <- getSunlightTimes(date = as.Date("2017-06-12"), lat = 48.86, lon = 2.34, tz = "CET")
    sun <- data.frame(
      sunrise = as.POSIXct("2017-06-12 05:48:14"),
      sunset = as.POSIXct("2017-06-12 21:55:32")
    )

    # line chart
    billboarder() %>%
      bb_linechart(
        data = cdc_prod_filiere,
        mapping = aes(date_heure, prod_solaire)
      ) %>%
      bb_x_axis(tick = list(format = "%H:%M", fit = FALSE)) %>%
      bb_y_axis(min = 0, padding = 0) %>%
      bb_regions(
        list(
          start = as.numeric(cdc_prod_filiere$date_heure[1]) * 1000,
          end = as.numeric(sun$sunrise)*1000
        ),
        list(
          start = as.numeric(sun$sunset) * 1000,
          end = as.numeric(cdc_prod_filiere$date_heure[48]) * 1000
        )
      ) %>%
      bb_x_grid(
        lines = list(
          list(value = as.numeric(sun$sunrise)*1000, text = "sunrise"),
          list(value = as.numeric(sun$sunset)*1000, text = "sunset")
        )
      ) %>%
      bb_labs(title = "Solar production (2017-06-12)",
              y = "In megawatt (MW)",
              caption = "Data source: RTE (https://opendata.rte-france.com)")

### Stacked area chart

    library(billboarder)

    # data
    data("cdc_prod_filiere")

    billboarder() %>%
      bb_linechart(
        data = cdc_prod_filiere[, c("date_heure", "prod_eolien", "prod_hydraulique", "prod_solaire")],
        type = "area"
      ) %>%
      bb_data(
        groups = list(list("prod_eolien", "prod_hydraulique", "prod_solaire")),
        names = list("prod_eolien" = "Wind", "prod_hydraulique" = "Hydraulic", "prod_solaire" = "Solar")
      ) %>%
      bb_legend(position = "inset", inset = list(anchor = "top-right")) %>%
      bb_colors_manual(
        "prod_eolien" = "#238443", "prod_hydraulique" = "#225EA8", "prod_solaire" = "#FEB24C",
        opacity = 0.8
      ) %>%
      bb_y_axis(min = 0, padding = 0) %>%
      bb_labs(title = "Renewable energy production (2017-06-12)",
              y = "In megawatt (MW)",
              caption = "Data source: RTE (https://opendata.rte-france.com)")

### Line range

Use RStudio >= 1.2.0 to display in viewer.

    # Generate data
    dat <- data.frame(
      date = seq.Date(Sys.Date(), length.out = 20, by = "day"),
      y1 = round(rnorm(20, 100, 15)),
      y2 = round(rnorm(20, 100, 15))
    )
    dat$ymin1 <- dat$y1 - 5
    dat$ymax1 <- dat$y1 + 5

    dat$ymin2 <- dat$y2 - sample(3:15, 20, TRUE)
    dat$ymax2 <- dat$y2 + sample(3:15, 20, TRUE)

    # Make chart : use ymin & ymax aes for range
    billboarder(data = dat) %>%
      bb_linechart(
        mapping = aes(x = date, y = y1, ymin = ymin1, ymax = ymax1),
        type = "area-line-range"
      ) %>%
      bb_linechart(
        mapping = aes(x = date, y = y2, ymin = ymin2, ymax = ymax2),
        type = "area-spline-range"
      ) %>%
      bb_y_axis(min = 50)

## Histogram & density

Create histograms with a numeric vector (or `data.frame`) :

    billboarder() %>%
      bb_histogram(data = rnorm(1e5), binwidth = 0.25) %>%
      bb_colors_manual()

With a grouping variable :

    # Generate some data
    dat <- data.frame(
      sample = c(rnorm(n = 1e4, mean = 1), rnorm(n = 1e4, mean = 2)),
      group = rep(c("A", "B"), each = 1e4), stringsAsFactors = FALSE
    )
    # Mean by groups
    samples_mean <- tapply(dat$sample, dat$group, mean)
    # histogram !
    billboarder() %>%
      bb_histogram(data = dat, x = "sample", group = "group", binwidth = 0.25) %>%
      bb_x_grid(
        lines = list(
          list(value = unname(samples_mean['A']), text = "mean of sample A"),
          list(value = unname(samples_mean['B']), text = "mean of sample B")
        )
      )

Density plot with the same data :

    billboarder() %>%
      bb_densityplot(data = dat, x = "sample", group = "group") %>%
      bb_x_grid(
        lines = list(
          list(value = unname(samples_mean['A']), text = "mean of sample A"),
          list(value = unname(samples_mean['B']), text = "mean of sample B")
        )
      )

## Radar charts

With single serie:

    data("avengers_wide")
    billboarder() %>%
      bb_radarchart(
        data = avengers_wide[, 1:2]
      )

Multiple series and with data in long format:

    data("avengers")
    billboarder() %>%
      bb_radarchart(
        data = avengers,
        mapping = bbaes(x = axis, y = value, group = group)
      )

## Gauge

Gauge can be created with:

    billboarder() %>%
      bb_gaugechart(value = 50, color = "#112446")

or with function `bauge()` which had special output and render function in shiny:

    bauge(round(sample.int(100, 1)), subtitle = "of total")

Multiple values gauge are also possible:

    billboarder() %>%
      bb_gaugechart(
        value = c(15, 30),
        name = c("A", "B"),
        color = c("steelblue", "firebrick")
      ) %>%
      bb_gauge(max = 60) %>%
      bb_data(
        labels = list(colors = "#FFF")
      )

## Treemap

Create a treemap chart with:

    data("mpg", package = "ggplot2")
    billboarder() %>%
      bb_treemapchart(
        data = table(manufacturer = mpg$manufacturer),
        mapping = aes(x = manufacturer, y = Freq),
        label = list(show = TRUE, threshold = 0.03),
        tile = "binary" # or "slice" or "dice"
      ) %>%
      bb_data(
        labels = list(colors = "#FFF")
      ) %>%
      bb_color(
        palette = colorRampPalette(c("#08519C", "#9ECAE1"))(15) #15 = n manufacturer
      )