Tôi cho rằng trực quan hóa dữ liệu là kỹ thuật tốt nhất để trình bày mọi báo cáo mô tả và phân tích trên một tập dữ liệu. Tôi là kiểu người rất yêu thích trực quan hóa dữ liệu. Bạn có thể kể trọn câu chuyện trên một màn hình duy nhất — tất nhiên còn tùy vào độ phức tạp của dữ liệu. Nếu bạn đang đọc hướng dẫn này, chắc hẳn bạn đã biết đến gói Ggplot2 trong R dùng để tạo ra những biểu đồ tuyệt vời cho phân tích nhưng phần nào thiếu tính năng động.
Quay lại với Highcharter: đây là một wrapper trong R của thư viện javascript HighCharts và các mô-đun của nó.
Các tính năng chính của gói này gồm:
Bạn có thể tạo nhiều loại biểu đồ với cùng một phong cách như scatter, bubble, chuỗi thời gian, heatmap, treemap, biểu đồ thanh, v.v.
Hỗ trợ nhiều đối tượng R.
Hỗ trợ Highstocks Charts, Choropleths.
Có phong cách piping được mọi người dùng và lập trình viên R yêu thích.
Nhiều chủ đề với diện mạo bắt mắt.
Hãy bắt tay vào thực hành và tạo một vài trực quan hóa với Highcharter theo các tính năng nêu trên:
Tạo một số biểu đồ cơ bản bằng hàm hchart
hchart là một hàm tổng quát nhận một đối tượng và trả về một đối tượng highcharter. Có những hàm có hành vi tương tự các hàm trong gói ggplot2 như:
hchart hoạt động giống qplot của ggplot2.
hc_add_series hoạt động giống geom_S của ggplot2.
hcaes hoạt động giống aes của ggplot2.
Hãy chọn một bộ dữ liệu. Tôi sẽ lấy bộ dữ liệu Pokemon cũng được cung cấp trong gói Highcharter. Xem lướt qua bộ dữ liệu.
pokemon%>%
count(type_1)%>%
arrange(n)%>%
hchart(type ="bar", hcaes(x = type_1, y = n))Được hỗ trợ bởi
Vậy là bạn đã có một biểu đồ thanh về hạng mục type 1 của pokemon.
Giả sử bạn muốn biểu đồ cột thay thế thì biến duy nhất cần đổi là type thành column.
pokemon%>%
count(type_1)%>%
arrange(n)%>%
hchart(type ="column", hcaes(x = type_1, y = n))Được hỗ trợ bởi
Treemap
pokemon%>%
count(type_1)%>%
arrange(n)%>%
hchart(type ="treemap", hcaes(x = type_1, value = n, color = n))Được hỗ trợ bởi
Chúng ta cũng có thể dùng hc_add_series để vẽ biểu đồ. Nó được dùng để thêm và xóa chuỗi khỏi đối tượng highchart.
Biểu đồ phân tán
highchart()%>%
hc_add_series(pokemon,"scatter", hcaes(x = height, y = weight))Được hỗ trợ bởi
Khác biệt chính giữa các hàm geom_ của ggplot2 và hc_add_series là chúng ta cần thêm dữ liệu và thẩm mỹ (aesthetics) một cách tường minh ở mỗi hàm, trong khi với ggplot2, có thể thêm dữ liệu và thẩm mỹ ở một lớp rồi tiếp tục thêm nhiều geom khác dùng chung dữ liệu và thẩm mỹ đó.
Một ví dụ chính xác được đưa ra dưới đây sử dụng bộ dữ liệu diamond trong gói 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")Được hỗ trợ bởi
Như trong ví dụ, biểu đồ được vẽ bằng ba chuỗi gồm phân tán, đường và dải diện tích.
Hãy tái hiện một phát triển javascript của highchart vào R bằng 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 ="Oceania", data = c(2,2,2,6,13,30,46))Được hỗ trợ bởi
Khi so sánh, bạn sẽ thấy từng khối mã javascript được chuyển thành các hàm R nối với nhau bằng pipeline. Chúng ta có thể xem qua một vài đối số như pointFormat của hctooltip với định dạng giống hệt trong mã Javascript; bạn có thể xem chi tiết tại đây.
Highstocks
Highstocks là các biểu đồ cho phân tích tài chính và chuỗi thời gian, hoạt động tốt với thư viện quamtmod, và rất dễ để vẽ các mã chứng khoán, sau đó bạn có thể thêm nhiều chuỗi bằng hc_add_series.
x <- getSymbols("GOOG", auto.assign =FALSE)
hchart(x)Được hỗ trợ bởi
Như trên biểu đồ, chúng ta không cần thêm mã bổ sung, hchart làm việc rất hiệu quả với đối tượng xts và cung cấp ảnh chụp động của dữ liệu. Bạn có thể dùng chức năng thu phóng để đi sâu dữ liệu thành các phần nhỏ hơn nhằm phân tích tốt hơn.
Hãy dùng hc_add_series.
y <- getSymbols("AMZN", auto.assign =FALSE)
highchart(type ="stock")%>%
hc_add_series(x)%>%
hc_add_series(y, type ="ohlc")Được hỗ trợ bởi
Như bạn thấy, trực quan hóa điều chỉnh lượng dữ liệu lớn rất hiệu quả.
Hãy thử stock với các đối tượng xts khác nhau.
Highmaps
Cách dễ nhất để vẽ bản đồ với highcharter là dùng hàm hcmap. Chọn một URL từ bộ sưu tập highmaps và dùng URL đó làm bản đồ trong hàm hcmap. Điều này sẽ tải xuống bản đồ và tạo một đối tượng dùng thông tin đó làm đối số mapdata.
Hãy vẽ bản đồ Ấn Độ.
hcmap("https://code.highcharts.com/mapdata/countries/in/in-all.js")%>%
hc_title(text ="India")Được hỗ trợ bởi
Đó là một bản đồ đơn giản, vậy còn chuyển nó thành choropleth thì sao.
Mỗi dữ liệu bản đồ tải về từ bộ sưu tập bản đồ highcharts đều có khóa để nối dữ liệu. Có 2 hàm hỗ trợ để biết các vùng được mã hóa nhằm nối bản đồ và dữ liệu:
download_map_data: Tải dữ liệu geojson từ bộ sưu tập highcharts.
get_data_from_map: Lấy thuộc tính cho từng vùng trên bản đồ, như các khóa từ dữ liệu bản đồ.
mapdata <- get_data_from_map(download_map_data("https://code.highcharts.com/mapdata/countries/in/in-all.js"))
glimpse(mapdata)Được hỗ trợ bởi
pokemon%>%
count(type_1)%>%
arrange(n)%>%
hchart(type ="bar", hcaes(x = type_1, y = n, color = type_1))%>%
hc_exporting(enabled =TRUE)Được hỗ trợ bởi
Cuối cùng, chúng ta thêm một vài chủ đề.
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())Được hỗ trợ bởi
Bạn có thể học được rất nhiều từ đây, đây là một thư viện đầy đủ cho Highcharter. Tôi cũng chia sẻ một trong những biểu đồ yêu thích được tạo trên bộ dữ liệu thời tiết; ở đây đối số thú vị polar được dùng: khi đặt TRUE, toàn bộ câu chuyện thay đổi.
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}")))Được hỗ trợ bởi
Tôi cho rằng trực quan hóa dữ liệu là kỹ thuật tốt nhất để trình bày mọi báo cáo mô tả và phân tích trên một tập dữ liệu. Tôi là kiểu người rất yêu thích trực quan hóa dữ liệu. Bạn có thể kể trọn câu chuyện trên một màn hình duy nhất — tất nhiên còn tùy vào độ phức tạp của dữ liệu. Nếu bạn đang đọc hướng dẫn này, chắc hẳn bạn đã biết đến gói Ggplot2 trong R dùng để tạo ra những biểu đồ tuyệt vời cho phân tích nhưng phần nào thiếu tính năng động.
Quay lại với Highcharter: đây là một wrapper trong R của thư viện javascript HighCharts và các mô-đun của nó.
Các tính năng chính của gói này gồm:
Hãy bắt tay vào thực hành và tạo một vài trực quan hóa với Highcharter theo các tính năng nêu trên:
Tạo một số biểu đồ cơ bản bằng hàm hchart
hchart là một hàm tổng quát nhận một đối tượng và trả về một đối tượng highcharter. Có những hàm có hành vi tương tự các hàm trong gói ggplot2 như:
qplotcủa ggplot2.geom_Scủa ggplot2.aescủa ggplot2.Hãy chọn một bộ dữ liệu. Tôi sẽ lấy bộ dữ liệu Pokemon cũng được cung cấp trong gói Highcharter. Xem lướt qua bộ dữ liệu.
Hãy vẽ một biểu đồ thanh.
Vậy là bạn đã có một biểu đồ thanh về hạng mục type 1 của pokemon.
Giả sử bạn muốn biểu đồ cột thay thế thì biến duy nhất cần đổi là type thành column.
Treemap
Chúng ta cũng có thể dùng hc_add_series để vẽ biểu đồ. Nó được dùng để thêm và xóa chuỗi khỏi đối tượng highchart.
Biểu đồ phân tán
Khác biệt chính giữa các hàm geom_ của ggplot2 và hc_add_series là chúng ta cần thêm dữ liệu và thẩm mỹ (aesthetics) một cách tường minh ở mỗi hàm, trong khi với ggplot2, có thể thêm dữ liệu và thẩm mỹ ở một lớp rồi tiếp tục thêm nhiều geom khác dùng chung dữ liệu và thẩm mỹ đó.
Một ví dụ chính xác được đưa ra dưới đây sử dụng bộ dữ liệu diamond trong gói ggplot2.
Như trong ví dụ, biểu đồ được vẽ bằng ba chuỗi gồm phân tán, đường và dải diện tích.
Hãy tái hiện một phát triển javascript của highchart vào R bằng hc_add_series.
Khi so sánh, bạn sẽ thấy từng khối mã javascript được chuyển thành các hàm R nối với nhau bằng pipeline. Chúng ta có thể xem qua một vài đối số như pointFormat của hctooltip với định dạng giống hệt trong mã Javascript; bạn có thể xem chi tiết tại đây.
Highstocks
Highstocks là các biểu đồ cho phân tích tài chính và chuỗi thời gian, hoạt động tốt với thư viện
quamtmod, và rất dễ để vẽ các mã chứng khoán, sau đó bạn có thể thêm nhiều chuỗi bằnghc_add_series.Như trên biểu đồ, chúng ta không cần thêm mã bổ sung, hchart làm việc rất hiệu quả với đối tượng xts và cung cấp ảnh chụp động của dữ liệu. Bạn có thể dùng chức năng thu phóng để đi sâu dữ liệu thành các phần nhỏ hơn nhằm phân tích tốt hơn.
Hãy dùng hc_add_series.
Như bạn thấy, trực quan hóa điều chỉnh lượng dữ liệu lớn rất hiệu quả.
Hãy thử stock với các đối tượng xts khác nhau.
Highmaps
Cách dễ nhất để vẽ bản đồ với highcharter là dùng hàm
hcmap. Chọn một URL từ bộ sưu tập highmaps và dùng URL đó làm bản đồ trong hàm hcmap. Điều này sẽ tải xuống bản đồ và tạo một đối tượng dùng thông tin đó làm đối số mapdata.Hãy vẽ bản đồ Ấn Độ.
Đó là một bản đồ đơn giản, vậy còn chuyển nó thành choropleth thì sao.
Mỗi dữ liệu bản đồ tải về từ bộ sưu tập bản đồ highcharts đều có khóa để nối dữ liệu. Có 2 hàm hỗ trợ để biết các vùng được mã hóa nhằm nối bản đồ và dữ liệu:
Hãy thử nghiệm với hc_add_series trong bản đồ và choropleth. Để biết thêm chi tiết và ví dụ, truy cập tại đây.
PlugIns
Bây giờ hãy thử một số plugin do highcharter cung cấp như nhóm dữ liệu, drill-down, tải xuống, in dữ liệu và một số chủ đề đẹp mắt.
Hãy nhóm dữ liệu của bộ mpg; ở đây, để trực quan hơn, chúng ta tạo một danh sách phân loại dữ liệu theo nhà sản xuất.
Hãy tạo một biểu đồ có thể drill-down sang biểu đồ khác để phân tích tốt hơn. Bạn có thể hiểu mã hiệu quả hơn nếu nắm vững list trong R.
Hãy áp dụng Drill down trên các biểu đồ khác.
Hãy thêm chức năng xuất dữ liệu.
Bạn có thể học được rất nhiều từ đây, đây là một thư viện đầy đủ cho Highcharter. Tôi cũng chia sẻ một trong những biểu đồ yêu thích được tạo trên bộ dữ liệu thời tiết; ở đây đối số thú vị
polarđược dùng: khi đặt TRUE, toàn bộ câu chuyện thay đổi.Nếu bạn muốn học thêm về Trực quan hóa dữ liệu trong R, hãy tham gia khóa Data Visualization with ggplot2 (Phần 1) của DataCamp và xem Hướng dẫn công thức R của chúng tôi.