Cursus
Ik vind datavisualisatie de beste techniek om beschrijvende en analytische rapportages over een set gegevens te tonen. Ik ben iemand die dol is op datavisualisatie. Je kunt het hele verhaal op één scherm laten zien — al hangt dat ook af van de complexiteit van de data. Als je deze tutorial leest, ken je waarschijnlijk het pakket Ggplot2 in R, waarmee je geweldige grafieken voor analyses kunt maken, maar dat het soms aan dynamiek ontbreekt.
Terug naar Highcharter: dit is een R-wrapper voor de HighCharts JavaScript-bibliotheek en de modules daarvan.
De belangrijkste features van dit pakket zijn:
- Je kunt verschillende grafieken in dezelfde stijl maken, zoals scatter, bubble, tijdreeksen, heatmaps, treemaps, staafdiagrammen, enz.
- Het ondersteunt verschillende R-objecten.
- Het ondersteunt Highstocks-grafieken en choroplethen.
- Het heeft een piping-stijl waar alle R-gebruikers en -programmeurs dol op zijn.
- Een grote variatie aan thema's met een prachtige uitstraling.
Laten we aan de slag gaan en wat visualisaties maken met Highcharter op basis van de bovenstaande features:
Basisgrafieken maken met de functie hchart
hchart is een generieke functie die een object aanneemt en een highcharter-object retourneert. Er zijn functies waarvan het gedrag lijkt op de functies uit het ggplot2-pakket, zoals:
- hchart werkt zoals
qplotvan ggplot2. - hc_add_series werkt zoals
geom_Svan ggplot2. - hcaes werkt zoals
aesvan ggplot2.
Laten we een dataset kiezen. Ik neem de Pokemon-dataset, die ook in het Highcharter-pakket zit. Werp een blik op de dataset.
glimpse(pokemon)
## Observations: 718
## Variables: 20
## $ id <dbl> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,...
## $ pokemon <chr> "bulbasaur", "ivysaur", "venusaur", "charmande...
## $ species_id <int> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,...
## $ height <int> 7, 10, 20, 6, 11, 17, 5, 10, 16, 3, 7, 11, 3, ...
## $ weight <int> 69, 130, 1000, 85, 190, 905, 90, 225, 855, 29,...
## $ base_experience <int> 64, 142, 236, 62, 142, 240, 63, 142, 239, 39, ...
## $ type_1 <chr> "grass", "grass", "grass", "fire", "fire", "fi...
## $ type_2 <chr> "poison", "poison", "poison", NA, NA, "flying"...
## $ attack <int> 49, 62, 82, 52, 64, 84, 48, 63, 83, 30, 20, 45...
## $ defense <int> 49, 63, 83, 43, 58, 78, 65, 80, 100, 35, 55, 5...
## $ hp <int> 45, 60, 80, 39, 58, 78, 44, 59, 79, 45, 50, 60...
## $ special_attack <int> 65, 80, 100, 60, 80, 109, 50, 65, 85, 20, 25, ...
## $ special_defense <int> 65, 80, 100, 50, 65, 85, 64, 80, 105, 20, 25, ...
## $ speed <int> 45, 60, 80, 65, 80, 100, 43, 58, 78, 45, 30, 7...
## $ color_1 <chr> "#78C850", "#78C850", "#78C850", "#F08030", "#...
## $ color_2 <chr> "#A040A0", "#A040A0", "#A040A0", NA, NA, "#A89...
## $ color_f <chr> "#81A763", "#81A763", "#81A763", "#F08030", "#...
## $ egg_group_1 <chr> "monster", "monster", "monster", "monster", "m...
## $ egg_group_2 <chr> "plant", "plant", "plant", "dragon", "dragon",...
## $ url_image <chr> "1.png", "2.png", "3.png", "4.png", "5.png", "...
Laten we een staafdiagram maken.
pokemon%>%
count(type_1)%>%
arrange(n)%>%
hchart(type = "bar", hcaes(x = type_1, y = n))

Je hebt nu een staafdiagram van de categorie type 1 van de Pokémon.
Stel dat je in plaats daarvan een kolomdiagram wilt, dan hoef je alleen de variabele type te wijzigen naar column.
pokemon%>%
count(type_1)%>%
arrange(n)%>%
hchart(type = "column", hcaes(x = type_1, y = n))

Treemap
pokemon%>%
count(type_1)%>%
arrange(n)%>%
hchart(type = "treemap", hcaes(x = type_1, value = n, color = n))

We kunnen ook hc_add_series gebruiken om de grafiek te plotten. Dit wordt gebruikt om reeksen toe te voegen aan en te verwijderen uit een highchart-object.

Scatterplot
highchart()%>%
hc_add_series(pokemon, "scatter", hcaes(x = height, y = weight))
Het belangrijkste verschil tussen de geom_-functies van ggplot2 en hc_add_series is dat we in elke functie expliciet data en aesthetics moeten toevoegen, terwijl je in ggplot2 data en aesthetics in een laag kunt toevoegen en daarna meer geoms kunt toevoegen die met dezelfde data en aesthetics werken.
Een duidelijk voorbeeld staat hieronder met de diamond-dataset uit het ggplot2-pakket.
data(diamonds, package = "ggplot2")
set.seed(123)
data <- sample_n(diamonds, 300)
modlss <- loess(price ~ carat, data = data)
fit <- arrange(augment(modlss), carat)
highchart() %>%
hc_add_series(data, type = "scatter",
hcaes(x = carat, y = price, size = depth, group = cut)) %>%
hc_add_series(fit, type = "line", hcaes(x = carat, y = .fitted),
name = "Fit", id = "fit") %>%
hc_add_series(fit, type = "arearange",
hcaes(x = carat, low = .fitted - 2*.se.fit,
high = .fitted + 2*.se.fit),
linkedTo = "fit")

Zoals in het voorbeeld te zien is, wordt de grafiek getekend met drie series: scatterplot, lijn en area-range.
Laten we een Highcharts-JavaScript-ontwikkeling nabootsen in R met hc_add_series.

highchart() %>%
hc_chart(type = "area") %>%
hc_title(text = "Historic and Estimated Worldwide Population Distribution by Region") %>%
hc_subtitle(text = "Source: Wikipedia.org") %>%
hc_xAxis(categories = c("1750", "1800", "1850", "1900", "1950", "1999", "2050"),
tickmarkPlacement = "on",
title = list(enabled = FALSE)) %>%
hc_yAxis(title = list(text = "Percent")) %>%
hc_tooltip(pointFormat = "<span style=\"color:{series.color}\">{series.name}</span>:
<b>{point.percentage:.1f}%</b> ({point.y:,.0f} millions)<br/>",
shared = TRUE) %>%
hc_plotOptions(area = list(
stacking = "percent",
lineColor = "#ffffff",
lineWidth = 1,
marker = list(
lineWidth = 1,
lineColor = "#ffffff"
))
) %>%
hc_add_series(name = "Asia", data = c(502, 635, 809, 947, 1402, 3634, 5268)) %>%
hc_add_series(name = "Africa", data = c(106, 107, 111, 133, 221, 767, 1766)) %>%
hc_add_series(name = "Europe", data = c(163, 203, 276, 408, 547, 729, 628)) %>%
hc_add_series(name = "America", data = c(18, 31, 54, 156, 339, 818, 1201)) %>%
hc_add_series(name = "Oceanië", data = c(2, 2, 2, 6, 13, 30, 46))

Bij de vergelijking zie je dat elk blok JavaScript-code is omgezet in R-functies die aan elkaar gepiped zijn. We kunnen kijken naar een paar argumenten, zoals pointFormat van hctooltip, dat in hetzelfde formaat wordt gebruikt als in de JavaScript-code. Meer details vind je hier.
Highstocks
Highstocks zijn grafieken voor financiële analyses en tijdreeksen. Het werkt goed met de quamtmod-bibliotheek en het is eenvoudig om symbolen te plotten; daarna kun je meer series toevoegen met hc_add_series.
x <- getSymbols("GOOG", auto.assign = FALSE)
hchart(x)

Zoals in de grafiek te zien is, hoeven we geen extra code toe te voegen; hchart werkt zeer efficiënt samen met het xts-object en geeft een dynamische momentopname van de data. Je kunt de zoomfunctionaliteit gebruiken om in te zoomen op kleinere delen van de data voor betere analyses.
Laten we hc_add_series gebruiken.
y <- getSymbols("AMZN", auto.assign = FALSE)
highchart(type = "stock") %>%
hc_add_series(x) %>%
hc_add_series(y, type = "ohlc")

Zoals je ziet past de visualisatie zich heel efficiënt aan de grote hoeveelheid data aan.
Probeer de stock eens met verschillende xts-objecten.
Highmaps
De makkelijkste manier om een kaart te plotten met highcharter is met een hcmap-functie. Kies een URL uit de highmaps-collectie en gebruik de URL als map in de hcmap-functie. Dit downloadt de kaart en maakt een object met de info als het mapdata-argument.
Laten we de kaart van India plotten.
hcmap("https://code.highcharts.com/mapdata/countries/in/in-all.js")%>%
hc_title(text = "India")

Dat is een eenvoudige kaart; hoe zit het met omzetten naar choroplethen?
Elke kaart die je downloadt uit de Highcharts map-collectie heeft sleutels om data te koppelen. Er zijn 2 functies die helpen te achterhalen welke regio's gecodeerd zijn en hoe je de kaart en data kunt joinen:
- download_map_data: download de geojson-data uit de Highcharts-collectie.
- get_data_from_map: haal de properties op voor elke regio in de kaart, zoals de keys uit de mapdata.
mapdata <- get_data_from_map(download_map_data("https://code.highcharts.com/mapdata/countries/in/in-all.js"))
glimpse(mapdata)
## Observations: 34
## Variables: 20
## $ `hc-group` <chr> "admin1", "admin1", "admin1", "admin1", "admin1"...
## $ `hc-middle-x` <dbl> 0.65, 0.59, 0.50, 0.56, 0.46, 0.46, 0.51, 0.59, ...
## $ `hc-middle-y` <dbl> 0.81, 0.63, 0.74, 0.38, 0.64, 0.51, 0.34, 0.41, ...
## $ `hc-key` <chr> "in-py", "in-ld", "in-wb", "in-or", "in-br", "in...
## $ `hc-a2` <chr> "PY", "LD", "WB", "OR", "BR", "SK", "CT", "TN", ...
## $ labelrank <chr> "2", "2", "2", "2", "2", "2", "2", "2", "2", "2"...
## $ hasc <chr> "IN.PY", "IN.LD", "IN.WB", "IN.OR", "IN.BR", "IN...
## $ `alt-name` <chr> "Pondicherry|Puduchcheri|Pondichéry", "Ã\u008dl...
## $ `woe-id` <chr> "20070459", "2345748", "2345761", "2345755", "23...
## $ fips <chr> "IN22", "IN14", "IN28", "IN21", "IN34", "IN29", ...
## $ `postal-code` <chr> "PY", "LD", "WB", "OR", "BR", "SK", "CT", "TN", ...
## $ name <chr> "Puducherry", "Lakshadweep", "West Bengal", "Ori...
## $ country <chr> "India", "India", "India", "India", "India", "In...
## $ `type-en` <chr> "Union Territory", "Union Territory", "State", "...
## $ region <chr> "South", "South", "East", "East", "East", "East"...
## $ longitude <chr> "79.7758", "72.7811", "87.7289", "84.4341", "85....
## $ `woe-name` <chr> "Puducherry", "Lakshadweep", "West Bengal", "Ori...
## $ latitude <chr> "10.9224", "11.2249", "23.0523", "20.625", "25.6...
## $ `woe-label` <chr> "Puducherry, IN, India", "Lakshadweep, IN, India...
## $ type <chr> "Union Territor", "Union Territor", "State", "St...
#population state wise
pop = as.data.frame(c(84673556, 1382611, 31169272, 103804637, 1055450, 25540196, 342853, 242911, 18980000, 1457723, 60383628, 25353081, 6864602,
12548926, 32966238, 61130704, 33387677, 64429, 72597565, 112372972, 2721756, 2964007, 1091014, 1980602, 41947358, 1244464,
27704236, 68621012, 607688, 72138958, 3671032, 207281477, 10116752,91347736))
state= mapdata%>%
select(`hc-a2`)%>%
arrange(`hc-a2`)
State_pop = as.data.frame(c(state, pop))
names(State_pop)= c("State", "Population")
hcmap("https://code.highcharts.com/mapdata/countries/in/in-all.js", data = State_pop, value = "Population",
joinBy = c("hc-a2", "State"), name = "Fake data",
dataLabels = list(enabled = TRUE, format = '{point.name}'),
borderColor = "#FAFAFA", borderWidth = 0.1,
tooltip = list(valueDecimals = 0))

Experimenteer met hc_add_series in kaarten en choroplethen. Voor meer details en voorbeelden, bezoek deze pagina.
Plug-ins
Laten we nu enkele plug-ins proberen die door highcharter worden geleverd, zoals groeperen, drilldowns, downloaden, data afdrukken en een paar geweldige thema's.
Laten we data uit de mpg-dataset groeperen. Voor een betere visualisatie hebben we hier een lijst gemaakt die data categoriseert op fabrikant.
data(mpg, package = "ggplot2")
mpgg <- mpg %>%
filter(class %in% c("suv", "compact", "midsize")) %>%
group_by(class, manufacturer) %>%
summarize(count = n())
categories_grouped <- mpgg %>%
group_by(name = class) %>%
do(categories = .$manufacturer) %>%
list_parse()
highchart() %>%
hc_xAxis(categories = categories_grouped) %>%
hc_add_series(data = mpgg, type = "bar", hcaes(y = count, color = manufacturer),
showInLegend = FALSE)

Laten we een grafiek maken die doorklikt naar een andere grafiek voor een betere analyse. Je begrijpt de code makkelijker als je lijsten in R begrijpt.
df <- data_frame(
name = c("Animals", "Fruits", "Cars"),
y = c(5, 2, 4),
drilldown = tolower(name)
)
ds <- list_parse(df)
names(ds) <- NULL
hc <- highchart() %>%
hc_chart(type = "column") %>%
hc_title(text = "Basic drilldown") %>%
hc_xAxis(type = "category") %>%
hc_legend(enabled = FALSE) %>%
hc_plotOptions(
series = list(
boderWidth = 0,
dataLabels = list(enabled = TRUE)
)
) %>%
hc_add_series(
name = "Things",
colorByPoint = TRUE,
data = ds
)
dfan <- data_frame(
name = c("Cats", "Dogs", "Cows", "Sheep", "Pigs"),
value = c(4, 3, 1, 2, 1)
)
dffru <- data_frame(
name = c("Apple", "Organes"),
value = c(4, 2)
)
dfcar <- data_frame(
name = c("Toyota", "Opel", "Volkswage"),
value = c(4, 2, 2)
)
second_el_to_numeric <- function(ls){
map(ls, function(x){
x[[2]] <- as.numeric(x[[2]])
x
})
}
dsan <- second_el_to_numeric(list_parse2(dfan))
dsfru <- second_el_to_numeric(list_parse2(dffru))
dscar <- second_el_to_numeric(list_parse2(dfcar))
hc %>%
hc_drilldown(
allowPointDrilldown = TRUE,
series = list(
list(
id = "animals",
data = dsan
),
list(
id = "fruits",
data = dsfru
),
list(
id = "cars",
data = dscar
)
)
)

Laten we drilldown toepassen op andere grafieken.
tm <- pokemon %>%
mutate(type_2 = ifelse(is.na(type_2), paste("only", type_1), type_2),
type_1 = type_1) %>%
group_by(type_1, type_2) %>%
summarise(n = n()) %>%
ungroup() %>%
treemap::treemap(index = c("type_1", "type_2"),
vSize = "n", vColor = "type_1")

tm$tm <- tm$tm %>%
tbl_df() %>%
left_join(pokemon %>% select(type_1, type_2, color_f) %>% distinct(), by = c("type_1", "type_2")) %>%
left_join(pokemon %>% select(type_1, color_1) %>% distinct(), by = c("type_1")) %>%
mutate(type_1 = paste0("Main ", type_1),
color = ifelse(is.na(color_f), color_1, color_f))
highchart() %>%
hc_add_series_treemap(tm, allowDrillToNode = TRUE,
layoutAlgorithm = "squarified")

Laten we de functionaliteit voor het exporteren van data toevoegen.
pokemon%>%
count(type_1)%>%
arrange(n)%>%
hchart(type = "bar", hcaes(x = type_1, y = n, color = type_1))%>%
hc_exporting(enabled = TRUE)
Tot slot voegen we wat thema's toe.pokemon%>%
count(type_1)%>%
arrange(n)%>%
hchart(type = "bar", hcaes(x = type_1, y = n, color = type_1))%>%
hc_exporting(enabled = TRUE)%>%
hc_add_theme(hc_theme_chalk())

Je kunt veel leren hier; het is een complete bibliotheek voor Highcharter. Ik deel ook een van mijn favoriete grafieken gemaakt op een weerdataset. Hier wordt een interessant argument polar gebruikt: door de waarde op TRUE te zetten, verandert het hele verhaal.
data("weather")
x <- c("Min", "Mean", "Max")
y <- sprintf("{point.%s}", c("min_temperaturec", "mean_temperaturec", "max_temperaturec"))
tltip <- tooltip_table(x, y)
hchart(weather, type = "columnrange",
hcaes(x = date, low = min_temperaturec, high = max_temperaturec,
color = mean_temperaturec)) %>%
hc_chart(polar = TRUE) %>%
hc_yAxis( max = 30, min = -10, labels = list(format = "{value} C"),
showFirstLabel = FALSE) %>%
hc_xAxis(
title = list(text = ""), gridLineWidth = 0.5,
labels = list(format = "{value: %b}")) %>%
hc_tooltip(useHTML = TRUE, pointFormat = tltip,
headerFormat = as.character(tags$small("{point.x:%d %B, %Y}")))

Wil je meer leren over datavisualisatie in R? Volg dan DataCamps cursus Data Visualization with ggplot2 (Part 1) en bekijk onze R Formula Tutorial.
