---
# https://github.com/dimitris1ps/zurichRMeetup
title: " Zurich R User meetup: Visualization special"
output:
flexdashboard::flex_dashboard:
source_code: "http://bit.do/zurichR"
navbar:
- { title: "Authors: Maciej, Dimitris", href: "mailto:mbledowski@ebay.com; dpsaradellis@ebay.com", align: right }
orientation: rows
vertical_layout: fill
logo: logo.png
favicon: favicon.ico
storyboard: false
theme: flatly
highlight: pygments
runtime: shiny
---
```{r setup, include=FALSE}
## Run once
# install.packages("pacman")
# install.packages("devtools")
# install.packages("magrittr")
# install.packages("dplyr")
# devtools::install_github("jrowen/rhandsontable")
# devtools::install_github("rstudio/leaflet")
# devtools::install_github("rstudio/DT")
# devtools::install_github("rstudio/shiny")
# devtools::install_github("rstudio/crosstalk")
# devtools::install_github("jcheng5/d3scatter")
# devtools::install_github("rstudio/leaflet@joe/feature/crosstalk-filter")
# devtools::install_github("rstudio/DT@joe/feature/crosstalk")
# devtools::install_github("hadley/ggplot2")
# devtools::install_github("jbkunst/highcharter")
# devtools::install_github("timelyportfolio/parsetR")
# devtools::install_github("rstudio/d3heatmap")
# devtools::install_github("renkun-ken/formattable")
## not run
pacman::p_load(dplyr, shiny, flexdashboard, crosstalk, highcharter, ggplot2, parsetR, DT,
leaflet, d3scatter, d3heatmap, magrittr, formattable, rhandsontable)
#### Data set 1
quakes$class <- factor(floor(quakes$mag), labels = c("Light", "Moderate", "Strong"))
set.seed(10101)
quakes <- quakes %>% sample_n(200)
quakesCT <- SharedData$new(quakes)
###################
#### Data set 2
set.seed(1979)
dfShankey <- data_frame(origins = sample(c('Zurich', 'Warsaw', 'Athens', 'Bern'), size = 100, replace = TRUE),
destinations = sample(c('Wellington', 'New York', 'Hanoi', 'Maseru'), size = 100, replace = TRUE)) %>%
group_by(origins, destinations) %>% summarize(counts = n()) %>% ungroup() %>% arrange(desc(counts))
dfShankeyCT <- SharedData$new(dfShankey)
###################
#### Data set 3
mtcarsCT <- SharedData$new(mtcars)
###################
```
| Home |
=====================================
Inputs {.sidebar}
-----------------------------------------------------------------------
```{r}
filter_slider("mag", "Magnitude", quakesCT, ~mag, step = 0.1)
filter_slider("depth", "Depth", quakesCT, ~depth)
filter_slider("counts", "Flights (sankeyNetwork)", dfShankeyCT, ~counts, step = 1)
filter_slider("mpg", "Miles per Gallon (heatmap)", mtcarsCT, ~mpg, step = 0.1)
filter_slider("hp", "horsepower (heatmap)", mtcarsCT, ~hp, step = 1)
```
Copyright © 2016 Zurich User meetup: Visualization special.
Built using - R,
- flexdashboard,
- shiny,
- DT,
- leaflet,
- highcharter,
- d3scatter,
- parsetR,
- ggplot2,
- formattable,
- rhandsontable,
- d3heatmap,
- crosstalk and ♥
Row 1
-----------------------------------------------------------------------
### Leaflet
```{r}
pal <- colorFactor(c("#1f77bf", "#ff7f0e", "#2ca02c"), quakes$class)
leaflet(quakesCT) %>% addTiles() %>% addCircles(radius = ~mag * 7000, weight = 1, fillOpacity = 0.8,
label = ~as.character(mag), color = ~pal(class))
```
### D3scatter
```{r}
d3scatter(quakesCT, x = ~depth, y = ~stations, color = ~class)
```
### HighCharter
```{r include=TRUE}
renderHighchart({hchart(quakesCT$data(withSelection = TRUE, withFilter = TRUE)$class, colorByPoint = TRUE)})
```
### Ggplot
```{r include=TRUE}
renderPlot({
df <- quakesCT$data(withSelection = TRUE, withFilter = TRUE)
ggplot(df, aes(x = mag, fill = selection_factor(df))) +
geom_histogram(binwidth = 0.2) + scale_fill_selection("#444444", "skyblue1")})
```
### SankeyNetwork
```{r}
renderParset({
parset(dfShankeyCT$data(withSelection = TRUE, withFilter = TRUE), dimensions = c('origins', 'destinations'),
value = htmlwidgets::JS("function(d){return d.counts}"), tension = 0.5)})
```
Row 2
-----------------------------------------------------------------------
### Datatable
```{r}
datatable(quakesCT, rownames = FALSE, extensions = 'Scroller',
options = list(scrollY = 200,scroller = TRUE))
```
### D3heatmap
```{r}
renderD3heatmap({
df3 <- mtcarsCT$data(withSelection = TRUE, withFilter = TRUE)
d3heatmap(df3[, -12], scale = "column", colors = "Spectral")
})
```
| Just Tables |
=====================================
Row 1
-------------------------------------
### DT with extentions
```{r}
df3 <- mtcars
df3$Cars <- rownames(mtcars)
cbind(Brands=df3[, 12], df3[, -12]) %>%
datatable(rownames=F,
# filter = 'top',
callback=JS('$("a.buttons-copy").css("background","#008CBA");
$("a.buttons-copy").css("font-size","15px");
$("a.buttons-copy").css("border-radius", "8px");
$("a.buttons-copy").css("margin-right","0px");
$("a.buttons-copy").hover(function(){
$(this).css("background-color", "#e7e7e7");
$(this).css("box-shadow", "0 12px 16px 0 rgba(0,0,0,0.24), 0 17px 50px 0 rgba(0,0,0,0.19)");
}, function(){
$(this).css("background-color", "#008CBA");
$(this).css("box-shadow", "0 12px 16px 0 rgba(0,0,0,0), 0 17px 50px 0 rgba(0,0,0,0)");
});
$("a.buttons-collection").css("background","#008CBA");
$("a.buttons-collection").css("font-size","15px");
$("a.buttons-collection").css("border-radius", "8px");
$("a.buttons-collection").css("margin-right","0px");
$("a.buttons-collection").hover(function(){
$(this).css("background-color", "#e7e7e7");
$(this).css("box-shadow", "0 12px 16px 0 rgba(0,0,0,0.24), 0 17px 50px 0 rgba(0,0,0,0.19)");
}, function(){
$(this).css("background-color", "#008CBA");
$(this).css("box-shadow", "0 12px 16px 0 rgba(0,0,0,0), 0 17px 50px 0 rgba(0,0,0,0)");
});
return table;'),
extensions = 'Buttons',
options = list(rownames = F,
searching=F,
paging = T,
bInfo = F,
columnDefs = list(list(className = 'dt-left', targets = 0),
list(className = 'dt-center', targets = 1:11)),
pageLength = 10,
initComplete = JS("function(settings, json) {",
"$(this.api().table().header()).css({'background-color': '#99ccff', 'color': '#003333'});","}"),
dom = 'Bfrtip',
buttons = list(list(extend = 'copy', text = ' COPY '),
list(extend = 'collection',
buttons = c('csv', 'pdf'),
text = 'DOWNLOAD')
)
)
)
```
Row 2 {.tabset .tabset-fade}
-------------------------------------
### Plain old DT
```{r}
datatable(quakes, rownames = FALSE, extensions = 'Scroller',
options = list(scrollY = 200,scroller = TRUE))
```
### formattable
```{r}
ft <- data.frame(
id = 1:10,
name = c("Bob", "Ashley", "James", "David", "Jenny",
"Hans", "Leo", "John", "Emily", "Lee"),
age = c(28, 27, 30, 28, 29, 29, 27, 27, 31, 30),
grade = c("C", "A", "A", "C", "B", "B", "B", "A", "C", "C"),
test1_score = c(8.9, 9.5, 9.6, 8.9, 9.1, 9.3, 9.3, 9.9, 8.5, 8.6),
test2_score = c(9.1, 9.1, 9.2, 9.1, 8.9, 8.5, 9.2, 9.3, 9.1, 8.8),
final_score = c(9, 9.3, 9.4, 9, 9, 8.9, 9.25, 9.6, 8.8, 8.7),
registered = c(TRUE, FALSE, TRUE, FALSE, TRUE, TRUE, TRUE, FALSE, FALSE, FALSE),
stringsAsFactors = FALSE)
formattable(ft, list(
age = color_tile("white", "orange"),
grade = formatter("span",
style = x ~ ifelse(x == "A", style(color = "green", font.weight = "bold"), NA)),
test1_score = normalize_bar("pink", 0.2),
test2_score = normalize_bar("pink", 0.2),
final_score = formatter("span",
style = x ~ style(color = ifelse(rank(-x) <= 3, "green", "gray")),
x ~ sprintf("%.2f (rank: %02d)", x, rank(-x))),
registered = formatter("span",
style = x ~ style(color = ifelse(x, "green", "red")),
x ~ icontext(ifelse(x, "ok", "remove"), ifelse(x, "Yes", "No")))
))
```
### Cool rhandsontable
```{r}
DF = data.frame(val = 1:10, bool = TRUE, big = LETTERS[1:10],
small = letters[1:10],
dt = seq(from = Sys.Date(), by = "days", length.out = 10),
stringsAsFactors = FALSE)
DF$chart = c(sapply(1:5,
function(x) jsonlite::toJSON(list(values=rnorm(10),
options = list(type = "bar")))),
sapply(1:5,
function(x) jsonlite::toJSON(list(values=rnorm(10),
options = list(type = "line")))))
rhandsontable(DF, rowHeaders = NULL, width = 550, height = 300) %>%
hot_col("chart", renderer = htmlwidgets::JS("renderSparkline"), columnSorting = TRUE, stretchH = "all")
```
### Cool..er rhandsontable
```{r}
DF = data.frame(
title = c(
"Professional JavaScript for Web Developers",
"JavaScript: The Good Parts",
"JavaScript: The Definitive Guide"
),
desc = c(
"This book provides a developer-level introduction along with more advanced and useful features of JavaScript.",
"This book provides a developer-level introduction along with more advanced and useful features of JavaScript.",
"JavaScript: The Definitive Guide provides a thorough description of the core JavaScript language and both the legacy and standard DOMs implemented in web browsers."
),
comments = c(
"I would rate it ★★★★☆",
"This is the book about JavaScript",
"I've never actually read it, but the comments are highly positive."
),
cover = c(
"http://ecx.images-amazon.com/images/I/51bRhyVTVGL._SL50_.jpg",
"http://ecx.images-amazon.com/images/I/51gdVAEfPUL._SL50_.jpg",
"http://ecx.images-amazon.com/images/I/51VFNL4T7kL._SL50_.jpg"
),
stringsAsFactors = FALSE
)
rhandsontable(DF, allowedTags = "",
width = 800, height = 450, rowHeaders = FALSE) %>%
hot_cols(colWidths = c(200, 200, 200, 80)) %>%
hot_col(1:2, renderer = "html") %>%
hot_col(1:3, renderer = htmlwidgets::JS("safeHtmlRenderer")) %>%
hot_col(4, renderer = "
function(instance, td, row, col, prop, value, cellProperties) {
var escaped = Handsontable.helper.stringify(value),
img;
if (escaped.indexOf('http') === 0) {
img = document.createElement('IMG');
img.src = value;
Handsontable.Dom.addEvent(img, 'mousedown', function (e){
e.preventDefault(); // prevent selection quirk
});
Handsontable.Dom.empty(td);
td.appendChild(img);
}
else {
// render as text
Handsontable.renderers.TextRenderer.apply(this, arguments);
}
return td;
}")
```