Lewati ke konten utama

Visualisasi Data dengan Highcharter di R

Pelajari cara menggunakan Highcharter untuk membuat visualisasi yang mengundang perhatian.
· 12 mnt Baca

Jelajahi bersama AI

Menurut saya, visualisasi data adalah teknik terbaik untuk menampilkan pelaporan deskriptif dan analitik pada sekumpulan data. Saya termasuk orang yang menyukai visualisasi data. Anda bisa menyajikan keseluruhan cerita dalam satu layar—meski ini juga bergantung pada kompleksitas datanya. Jika Anda membaca tutorial ini, saya berasumsi Anda sudah mengenal paket Ggplot2 di R yang digunakan untuk menghasilkan berbagai grafik yang menarik untuk analisis, namun agak kurang dalam hal sifat dinamis.

Kembali ke Highcharter, ini adalah pembungkus (wrapper) R untuk library javascript HighCharts beserta modulnya.

Fitur utama paket ini antara lain:

  • Anda dapat membuat berbagai bagan dengan gaya yang sama seperti scatter, bubble, time series, heatmap, treemap, bagan batang, dan lainnya.
  • Mendukung berbagai objek R.
  • Mendukung Highstocks Charts, Choropleth.
  • Memiliki gaya piping yang disukai semua pengguna dan programmer R.
  • Beragam tema dengan tampilan yang memukau.

Mari langsung praktik dan membuat beberapa visualisasi dengan Highcharter mengikuti fitur-fitur di atas:

Membuat Beberapa Grafik Dasar Menggunakan Fungsi hchart

hchart adalah fungsi generik yang menerima sebuah objek dan mengembalikan objek highcharter. Ada fungsi-fungsi yang perilakunya mirip dengan fungsi pada paket ggplot2 seperti:

  • hchart bekerja seperti qplot milik ggplot2.
  • hc_add_series bekerja seperti geom_S milik ggplot2.
  • hcaes bekerja seperti aes milik ggplot2.

Mari pilih sebuah dataset. Saya akan menggunakan dataset Pokemon yang juga disediakan dalam paket Highcharter. Lihat sekilas datasetnya.

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", "...

Mari buat bagan batang.

pokemon%>%
  count(type_1)%>%
  arrange(n)%>%
  hchart(type = "bar", hcaes(x = type_1, y = n))
bar chart

Anda mendapatkan bagan batang terkait kategori type 1 dari pokemon.

Misalkan Anda ingin bagan kolom, maka satu-satunya variabel yang perlu diubah adalah type menjadi column.

pokemon%>%
  count(type_1)%>%
  arrange(n)%>%
  hchart(type = "column", hcaes(x = type_1, y = n))
bar chart 2

Treemap

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

Kita juga dapat menggunakan hc_add_series untuk memplot bagan. Fungsi ini digunakan untuk menambah dan menghapus series dari objek highchart.

scatterplot

Scatterplot

highchart()%>%
  hc_add_series(pokemon, "scatter", hcaes(x = height, y = weight))

Perbedaan utama antara fungsi geom_ di ggplot2 dan hc_add_series adalah kita perlu menambahkan data dan estetika secara eksplisit di setiap fungsi, sedangkan di ggplot2 kita bisa menambahkan data dan estetika pada satu layer lalu menambahkan geom lain yang bekerja pada data dan estetika yang sama.

Contoh yang tepat diberikan di bawah ini menggunakan dataset diamond pada paket ggplot2.

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

Seperti pada contoh, grafik diplot menggunakan tiga series yang terdiri dari Scatterplot, garis, dan Area-range.

Mari mereplikasi pengembangan javascript highchart ke dalam R menggunakan hc_add_series.

javascript highchart

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 = "Oceania", data = c(2, 2, 2, 6, 13, 30, 46))
linechart

Jika dibandingkan, Anda dapat melihat setiap blok kode javascript dikonversi menjadi fungsi R yang saling terhubung dengan pipe. Kita bisa melihat beberapa argumen seperti pointFormat milik hctooltip dalam format yang digunakan sama seperti pada kode Javascript; detailnya dapat dilihat di tautan ini.

Highstocks

Highstocks adalah bagan untuk analisis finansial dan deret waktu; ini bekerja baik dengan library quamtmod, dan memudahkan untuk memplot simbol, lalu Anda bisa menambahkan lebih banyak series menggunakan hc_add_series.

x <- getSymbols("GOOG", auto.assign = FALSE)

hchart(x)
highstocks

Seperti pada bagan tersebut, kita tidak perlu menambahkan kode tambahan; hchart berpadu dengan objek xts secara sangat efisien dan memberikan cuplikan data yang dinamis. Anda dapat menggunakan fungsi zoom untuk menelusuri data dalam potongan yang lebih kecil demi analisis yang lebih baik.

Mari gunakan hc_add_series.

y <- getSymbols("AMZN", auto.assign = FALSE)

highchart(type = "stock") %>%
  hc_add_series(x) %>%
  hc_add_series(y, type = "ohlc")
highstocks 2

Seperti yang terlihat, visualisasi ini menyesuaikan volume data yang besar dengan sangat efisien.

Cobalah stok dengan berbagai objek xts.

Highmaps

Cara termudah untuk memetakan peta dengan highcharter adalah menggunakan fungsi hcmap. Pilih sebuah URL dari koleksi highmaps dan gunakan URL tersebut sebagai peta pada fungsi hcmap. Ini akan mengunduh peta dan membuat objek menggunakan info tersebut sebagai argumen mapdata.

Mari plot peta India.

hcmap("https://code.highcharts.com/mapdata/countries/in/in-all.js")%>%
  hc_title(text = "India")
highmap

Itu peta polos; bagaimana jika kita mengubahnya menjadi choropleth.

Setiap data peta yang diunduh dari koleksi peta highcharts memiliki key untuk menggabungkan data. Ada 2 fungsi yang membantu mengetahui region yang dikodekan agar tahu cara menggabungkan peta dan data:

  • download_map_data: Mengunduh data geojson dari koleksi highcharts.
  • get_data_from_map: Mendapatkan properti untuk setiap region pada peta, seperti key dari data peta.
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

Lakukan beberapa eksperimen dengan hc_add_series pada peta dan choropleth. Untuk beberapa detail dan contoh, kunjungi tautan ini.

PlugIns

Sekarang mari coba beberapa plugin yang disediakan oleh highcharter seperti pengelompokan, drill-down, mengunduh, mencetak data, dan beberapa tema yang menarik.

Mari kelompokkan data dari dataset mpg; di sini demi visualisasi yang lebih baik kita membuat sebuah list yang mengkategorikan data menurut manufacturer.

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

Mari buat sebuah bagan yang melakukan drill-down ke bagan lain untuk analisis yang lebih baik. Anda akan lebih mudah memahami kodenya jika Anda memahami list di R.

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

Mari terapkan Drill down pada bagan lainnya.

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

Mari tambahkan fungsi ekspor data.

pokemon%>%
  count(type_1)%>%
  arrange(n)%>%
  hchart(type = "bar", hcaes(x = type_1, y = n, color = type_1))%>%
  hc_exporting(enabled = TRUE)
chart 5 Terakhir, kita tambahkan beberapa tema.
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())
chart 6

Anda dapat belajar banyak dari tautan ini; ini adalah library lengkap untuk Highcharter. Saya juga membagikan salah satu grafik favorit saya yang dibuat pada dataset cuaca; di sini salah satu argumen menarik polar digunakan—dengan mengatur argumen ke TRUE, keseluruhan tampilannya berubah.

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

Jika Anda ingin mempelajari lebih lanjut tentang Visualisasi Data di R, ikuti kursus Data Visualization with ggplot2 (Bagian 1) dari DataCamp dan lihat juga Tutorial Rumus R kami.

Topik

Terkait

blogs

Tutorial Korelasi di R

blogs

Spaghetti Plot dan Jalur Badai

blogs

40 Pertanyaan Wawancara DBMS Teratas di 2026