---
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](https://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](https://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](https://c3js.org/reference.html#data-onclick) and [examples](https://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](https://c3js.org/reference.html#tooltip-format-title). Or for more advanced usage see the `C3.js` [examples](https://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; }')))


```




