Author: Victor Perrier
Date: 2023-09-29

# Options - styling charts

#### Victor Perrier

#### 2023-09-29

## Title

Add a title to your chart with `bb_title` or `bb_labs` (`bb_labs` is a shortcut to set title and axis labels at the same time, but with no options for placement) :

    billboarder() %>%
      bb_barchart(table(sample(letters[1:6], 50, TRUE))) %>%
      bb_title(text = "My title", position = "center")

## Colors

You can specify a new color palette with function `bb_color` :

    data("prod_par_filiere")
    prod_par_filiere[, c(1, 3, 4, 5, 6, 8)]
    #>   annee prod_therm prod_hydraulique prod_bioenergies prod_eolien prod_solaire
    #> 1  2012       48.1             63.8              5.8        14.9          4.1
    #> 2  2013       43.6             75.5              7.1        15.9          4.7
    #> 3  2014       25.9             68.1              7.5        17.1          5.9
    #> 4  2015       34.4             59.1              8.0        21.1          7.4
    #> 5  2016       45.9             63.9              8.5        20.7          8.3

    # Default
    billboarder() %>%
      bb_barchart(data = prod_par_filiere[, c(1, 3, 4, 5, 6, 8)])

    # RColorBrewer palette
    library("RColorBrewer")
    billboarder() %>%
      bb_barchart(data = prod_par_filiere[, c(1, 3, 4, 5, 6, 8)]) %>%
      bb_color(palette = brewer.pal(n = 5, name = "Dark2"))

Or you can specify each color associated with data with `bb_colors_manual` :

    billboarder() %>%
      bb_barchart(data = prod_par_filiere[, c(1, 3, 4, 5, 6, 8)]) %>%
      bb_colors_manual(
        prod_therm = "maroon",
        prod_hydraulique = "royalblue",
        prod_bioenergies = "forestgreen",
        prod_eolien = "plum",
        prod_solaire = "goldenrod"
      )

Note : be careful when using named colors, CSS don’t recognize color variant such as `royalblue2`, `firebrick3`, … Use HEX code instead.

For bar charts, you can highlight a value in a simple barchart with :

    billboarder() %>%
      bb_barchart(data = prod_par_filiere[, c(1, 4)], color = "grey") %>%
      bb_bar_color_manual(values = c("2015" = "firebrick"))

## Axis

Add a label to an axis :

    # data source : wikipedia
    sw <- data.frame(
      film = c("The Force Awakens", "The Phantom Menace",
               "Revenge of the Sith", "A New Hope",
               "Attack of the Clones", "The Empire Strikes Back",
               "Return of the Jedi"),
      worldwide_gross = c(2068178225, 1027044677, 848754768,
                          775398007, 649398328, 538375067, 475106177)
    )

    billboarder() %>%
      bb_barchart(data = sw) %>%
      bb_y_axis(label = list(text = "Worldwide grosses", position = "outer-middle"))

You can format values on an axis with JavaScript (use `htmlwidgets::JS` to mark your character string as literal JavaScript) :

    billboarder() %>%
      bb_barchart(data = sw) %>%
      bb_y_axis(tick = list(
        values = c(0, 5e+08, 1e+09, 1.5e+09, 2e+09),
        outer = FALSE,
        format = htmlwidgets::JS("d3.formatPrefix('$,.0', 1e6)")
      ))

If you just want to add a suffix or prefix to the value, use the functions with the same name :

    sw2 <- sw
    # calculate percentage
    sw2$percent <- sw2$worldwide_gross / sum(sw2$worldwide_gross) * 100
    sw2$percent <- round(sw2$percent)

    sw2$worldwide_gross <- NULL

    billboarder() %>%
      bb_barchart(data = sw2) %>%
      bb_y_axis(tick = list(format = suffix("%")))

You can apply a format to x axis as well (especially useful with time), and `fit = FALSE` to don’t show all ticks :

    data("cdc_prod_filiere")
    billboarder() %>%
      bb_linechart(data = cdc_prod_filiere[, c("date_heure", "prod_solaire")]) %>%
      bb_x_axis(tick = list(format = "%H:%M", fit = FALSE))

Set a minimum on an axis (and look at the difference between above x-axis and below, without `fit = FALSE`) :

    billboarder() %>%
      bb_linechart(data = cdc_prod_filiere[, c("date_heure", "prod_solaire")]) %>%
      bb_y_axis(min = 0, padding = 0)

## Legend

By default, legend is shown, you can hide it with `bb_lengend`

    df <- data.frame(
      cos = cos(seq(-pi, pi, length.out = 30))
    )

    # No legend
    billboarder() %>%
      bb_linechart(data = df) %>%
      bb_legend(show = FALSE)

You can change the name appearing in the legend with `bb_data`, by giving an alias to the variable in the data. Here we have a column named `cos` in our `data.frame`, we renamed it `Cosine`.

    billboarder() %>%
      bb_linechart(data = df) %>%
      bb_data(names = list(cos = "Cosine"))

Legend can be postionned with argument `position`, three values are possible : `"bottom"` (the default), `"right"` and `"inset"`. For the last one, you must specify in which area of the chart the legend must be placed.

    df$sin <- sin(seq(-pi, pi, length.out = 30))

    billboarder() %>%
      bb_linechart(data = df) %>%
      bb_legend(position = "right")

    billboarder() %>%
      bb_linechart(data = df) %>%
      bb_legend(position = "inset", inset = list(anchor = "top-left"))

## Grids

You can add grids to a chart with `bb_x_axis` and `bb_y_axis` :

    billboarder() %>%
      bb_linechart(data = df) %>%
      bb_y_grid(show = TRUE) %>%
      bb_x_grid(show = TRUE)

This option also allows you to add vertical and horizontal lines :

    billboarder() %>%
      bb_linechart(data = df) %>%
      bb_y_grid(lines = list(
        list(value = 0, text = "Zero")
      ))

## Tooltip

You can show the tooltip separately for each serie in the chart :

    billboarder() %>%
      bb_linechart(data = df) %>%
      bb_tooltip(grouped = FALSE)

You can change the format of the tooltip with a JavaScript function, for example `d3.format`. Write the function as a character vector, and use `htmlwidgets::JS` to mark it as literal JavaScript code.

    billboarder() %>%
      bb_barchart(data = sw) %>%
      bb_tooltip(format = list(
        name =  htmlwidgets::JS("function(name, ratio, id, index) {return 'Worldwide grosses';}"),
        value = htmlwidgets::JS("d3.format('$,')")
      ))

## End

All options combined :

    billboarder() %>%
      bb_barchart(data = sw, color = "#CAD5DB") %>%
      bb_bar_color_manual(values = c("A New Hope" = "#112446")) %>%
      bb_legend(show = FALSE) %>%
      bb_y_grid(show = TRUE) %>%
      bb_y_axis(tick = list(
        values = c(0, 5e+08, 1e+09, 1.5e+09, 2e+09),
        outer = FALSE,
        format = htmlwidgets::JS("d3.formatPrefix('$,.0', 1e6)")
      )) %>%
      bb_tooltip(format = list(
        name =  htmlwidgets::JS("function(name, ratio, id, index) {return 'Worldwide grosses';}"),
        value = htmlwidgets::JS("d3.format('$,')")
      )) %>%
      bb_labs(
        title = "Star Wars - Total Lifetime Grosses",
        y = "Worldwide grosses",
        caption = "Data source : wikipedia"
      )