Ga naar hoofdinhoud

Datavisualisatie met Highcharter in R

Leer hoe je met Highcharter een visualisatie maakt die voor buzz zorgt.
Bijgewerkt 2 okt 2026  · 12 min lezen

Verken met AI

ChatGPTClaudePerplexity

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 qplot van ggplot2.
  • hc_add_series werkt zoals geom_S van ggplot2.
  • hcaes werkt zoals aes van 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))
staafdiagram

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))
staafdiagram 2

Treemap

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

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

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")
scatterplot 2

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.

Highcharts' javascript

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))
lijndiagram

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)
highstocks

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")
highstocks 2

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")
highmap

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))
highmap 2

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)
grafiek

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
      )
    )
  )
grafiek 2

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")
.grafiek 3
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")
grafiek 4

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)
grafiek 5 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())
grafiek 6

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}")))
grafiek 7

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

Onderwerpen
Datavisualisatie
Data Science
R

Leer meer over R en datavisualisatie

Cursus

Introductie tot datavisualisatie met ggplot2

4 uur
189.9K
Leer hoe je met ggplot2 betekenisvolle en mooie datavisualisaties maakt door de grammatica van graphics te begrijpen.
Bekijk detailsRight Arrow
Start Cursus
Meer bekijkenRight Arrow
Gerelateerd

blog

AI vanaf nul leren in 2026: een complete gids van de experts

Ontdek alles wat je moet weten om in 2026 AI te leren, van tips om te beginnen tot handige resources en inzichten van industrie-experts.
Adel Nehme's photo

Adel Nehme

15 min

Meer BekijkenMeer Bekijken