---
title: "c3 Basics"
output:
rmarkdown::html_vignette:
fig_caption: yes
self_contained: yes
toc: no
vignette: >
%\VignetteIndexEntry{Basic Use}
%\VignetteEngine{knitr::rmarkdown}
\usepackage[utf8]{inputenc}
---
```{r setup, warning=FALSE, message=FALSE, echo=FALSE}
library(dplyr)
```
The `c3` package is a wrapper, or [htmlwidget](http://www.htmlwidgets.org/), for the [C3](http://c3js.org/) javascript charting library by [Masayuki Tanaka](https://github.com/masayuki0812). You will find this package useful if you are wanting to create a chart using [R](https://www.r-project.org/) and embedding it in a Rmarkdown document or Shiny App.
The `C3` library is very versatile and includes a lot of options. Currently this package wraps most of the `C3` [options object](http://c3js.org/reference.html). Even with this current limitation a wide range of options are available.
## Installation
You probably already guessed this bit.
```{r install, eval=FALSE}
install.packages('c3')
# OR
devtools::install_github("mrjoh3/c3")
```
## Usage
The `c3` package is intended to be as simple and lightweight as possible. As a starting point the data input must be a `data.frame` or `tibble` with several options.
* If a `data.frame` without any options is passed all of the numeric columns will be plotted. This can be used in line and bar plots. Each column is a line or bar.
* For more complex plots only 3 columns are used, those defined as `x`, `y` and `group`. This requires a `data.frame` with a vertical structure.
### The Basics
Where no options are supplied a simple line plot is produced by default. Where no x-axis is defined the plots are sequential. `Date` x-axis can be parsed with not additional setting if in the format `%Y-%m-%d` (ie '2014-01-01')
```{r data, warning=FALSE, message=FALSE, fig.align='center', fig.width=8, fig.height=3}
library(c3)
data <- data.frame(a = abs(rnorm(20) * 10),
b = abs(rnorm(20) * 10),
date = seq(as.Date("2014-01-01"), by = "month", length.out = 20))
c3(data)
```
### Piping
The package also imports the [magrittr](https://CRAN.R-project.org/package=magrittr) piping function (`%>%`) to simplify syntax.
```{r pipe, warning=FALSE, message=FALSE, fig.align='center', fig.width=8, fig.height=3}
data %>% c3()
```
## Other Line Plots
There are 5 different line plots available:
* line
* spline
* step
* area
* area-step
#### Spline
```{r spline, warning=FALSE, message=FALSE, fig.align='center', fig.width=8, fig.height=3}
data %>%
c3() %>%
c3_line('spline')
```
#### Step
```{r step, warning=FALSE, message=FALSE, fig.align='center', fig.width=8, fig.height=3}
data %>%
c3(x = 'date') %>%
c3_line('area-step')
```
## Bar Plots
```{r bar, warning=FALSE, message=FALSE, fig.align='center', fig.width=8, fig.height=3}
data[1:10, ] %>%
c3() %>%
c3_bar(stacked = TRUE,
rotate = TRUE)
```
## Mixed Geometry Plots
Mixed geometry currently only works with a horizontal `data.frame` where each numeric column is plotted.
```{r mixed, warning=FALSE, message=FALSE, fig.align='center', fig.width=8, fig.height=3}
data$c <- abs(rnorm(20) *10)
data$d <- abs(rnorm(20) *10)
data %>%
c3() %>%
c3_mixedGeom(type = 'bar',
stacked = c('b','d'),
types = list(a='area',
c='spline')
)
```
## Secondary Y Axis
To use a secondary Y axis columns must first be matched to an axis and then the secondary axis made visible.
```{r y2, warning=FALSE, message=FALSE, fig.align='center', fig.width=8, fig.height=3}
data %>%
select(date, a, b) %>%
c3(x = 'date',
axes = list(a = 'y',
b = 'y2')) %>%
c3_mixedGeom(types = list(a = 'line',
b = 'area')) %>%
y2Axis()
```
## Scatter Plot
```{r scatter, warning=FALSE, message=FALSE, fig.align='center', fig.width=8, fig.height=3}
mtcars %>%
c3(x = 'mpg',
y = 'wt',
group = 'cyl') %>%
c3_scatter()
```
## Pie Charts
```{r pie, warning=FALSE, message=FALSE, fig.align='center', fig.width=4, fig.height=3}
data.frame(sugar = 20,
fat = 45,
salt = 10) %>%
c3() %>%
c3_pie()
```
## Donut Charts
```{r donut, warning=FALSE, message=FALSE, fig.align='center', fig.width=4, fig.height=3}
data.frame(red = 82, green = 33, blue = 93) %>%
c3(colors = list(red = 'red',
green = 'green',
blue = 'blue')) %>%
c3_donut(title = '#d053ee')
```
## Gauge Charts
```{r gauge, warning=FALSE, message=FALSE, fig.align='center', fig.width=6, fig.height=3}
data.frame(data = 80) %>%
c3() %>%
c3_gauge()
```
## Grid Lines & Annotation
```{r grid, warning=FALSE, message=FALSE, fig.align='center', fig.width=8, fig.height=3}
data %>%
c3() %>%
grid('y') %>%
grid('x',
show = F,
lines = data.frame(value = c(3, 10),
text= c('Line 1','Line 2')))
```
## Region Highlighting
To highlight regions pass a single `data.frame` with columns `axis`, `start`, `end` and `class`. Multiple regions can be defined within the one `data.frame` for any axis (`x`, `y`, `y2`). Each row in the `data.frame` defines a separate region to be highlighted
```{r region, warning=FALSE, message=FALSE, fig.align='center', fig.width=8, fig.height=3}
data %>%
c3() %>%
region(data.frame(axis = 'x',
start = 5,
end = 6))
```
## Sub-chart
```{r subchart, warning=FALSE, message=FALSE, fig.align='center', fig.width=8, fig.height=3}
data %>%
c3(x = 'date') %>%
subchart()
```
## Color Palette
Plot color palettes can be changed to either `RColorBrewer` or `viridis` palettes using either `RColorBrewer` (S3 method) or `c3_viridus`.
```{r brewer, warning=FALSE, message=FALSE, fig.align='center', fig.width=4, fig.height=3}
data.frame(sugar = 20,
fat = 45,
salt = 10,
vegetables = 60) %>%
c3() %>%
c3_pie() %>%
RColorBrewer()
```
```{r viridis, warning=FALSE, message=FALSE, fig.align='center', fig.width=4, fig.height=3}
data.frame(sugar = 20,
fat = 45,
salt = 10,
vegetables = 60) %>%
c3() %>%
c3_pie() %>%
c3_viridis()
```
## Point Size
```{r point, warning=FALSE, message=FALSE, fig.align='center', fig.width=8, fig.height=3}
data %>%
c3(x = 'date') %>%
point_options(r = 6,
expand.r = 2)
```
## On Click
Onclick, onmouseover and onmouseout are all available via the `c3` function. To use wrap a js function as a character string to `htmlwidgets::JS()`. Please see the [C3.js documentation](http://c3js.org/reference.html#data-onclick) and [examples](http://c3js.org/samples/chart_pie.html). The example below should be enough to get you started.
```{r onclick, eval=FALSE}
data %>%
c3(onclick = htmlwidgets::JS('function(d, element){console.log(d)}'))
```
## Tooltips
`C3` tooltips are readily modified with the use of javascript functions. For further detail see the `C3.js` [documentation](http://c3js.org/reference.html#tooltip-format-title). Or for more advanced usage see the `C3.js` [examples](http://c3js.org/samples/tooltip_format.html) page.
```{r tooltip, warning=FALSE, message=FALSE, fig.align='center', fig.width=8, fig.height=3}
library(htmlwidgets)
data %>%
c3() %>%
tooltip(format = list(title = JS("function (x) { return 'Data ' + x; }"),
name = JS('function (name, ratio, id, index) { return name; }'),
value = JS('function (value, ratio, id, index) { return ratio; }')))
```