Khóa học
Histogram giúp bạn nhìn nhanh hình dạng phân phối của một tập dữ liệu. Trong hướng dẫn này, tôi sẽ dẫn bạn từng bước tạo và tùy biến histogram bằng ggplot2, thư viện vẽ đồ thị được dùng rộng rãi nhất của R và là phần cốt lõi của hệ sinh thái tidyverse. ggplot2 tuân theo "ngữ pháp của đồ họa" cho phép bạn xây dựng các trực quan hóa phức tạp bằng cách xếp lớp các thành phần đồ thị. Nếu muốn dùng cách tiếp cận base R, hãy xem hướng dẫn histogram với base R của chúng tôi.
TL;DR
-
Dùng
geom_histogram()bên trong lời gọiggplot()để vẽ histogram -
Điều khiển số lượng thùng bằng
binshoặc kích thước thùng bằngbinwidthtronggeom_histogram() -
Tùy biến màu cột bằng tham số
color(viền) vàfill(bên trong) -
Chồng thêm đường mật độ bằng
geom_density()sau khi đặty = after_stat(density) -
Phân chia theo nhóm bằng
fill = variabletrongaes()hoặc dùngfacet_grid()để tách thành các ô đồ thị riêng
Histogram là gì?
Histogram là biểu đồ hiển thị phân phối tần suất trên các biến liên tục (số). Chúng cho phép chúng ta thấy số lượng quan sát trong dữ liệu nằm trong các khoảng mà biến liên tục bao phủ.
Bắt đầu với ggplot2
Để theo dõi hướng dẫn này, bạn cần cài đặt R và các gói sau: ggplot2, readr và dplyr. Đoạn mã ở phần tiếp theo sẽ cài đặt chúng nếu bạn chưa có.
Cài đặt các gói
Trước hết, chúng ta sẽ nhập thư viện ggplot2 bằng hàm library. Việc này sẽ đưa vào tất cả các hàm dựng sẵn trong thư viện ggplot2. Nếu bạn chưa cài đặt ggplot2, bạn cần cài bằng lệnh install.packages(). Chúng ta sẽ làm tương tự cho thư viện readr, giúp đọc tệp CSV, và dplyr, giúp làm việc với dữ liệu dễ dàng hơn.
install.packages("ggplot2")
install.packages("readr")
install.packages("dplyr")
library(ggplot2)
library(readr)
library(dplyr)
Nạp dữ liệu
Trong hướng dẫn này, chúng ta sẽ dùng bộ dữ liệu nhà ở này, bao gồm thông tin về các bất động sản rao bán như diện tích nhà, số phòng, giá và vị trí.
Chúng ta có thể đọc dữ liệu bằng hàm read_csv(). Có thể đọc trực tiếp từ URL hoặc tải tệp CSV về một thư mục và đọc từ lưu trữ cục bộ. Thuộc tính đầu tiên của read_csv() là vị trí dữ liệu, và thuộc tính col_select cho phép chọn các cột mà chúng ta quan tâm.
home_data <- read_csv(
"https://raw.githubusercontent.com/rashida048/Datasets/master/home_data.csv",
col_select = c(price, condition)
)
Tiếp theo, chúng ta có thể xem vài dòng đầu của dữ liệu bằng hàm head():
head(home_data)

Cách tạo Histogram với ggplot2
Bây giờ chúng ta có thể tạo histogram. Bất kể loại biểu đồ nào trong ggplot2, ta luôn bắt đầu với hàm ggplot(), hàm này tạo một khung vẽ để thêm các thành phần đồ thị. Nó nhận hai tham số.
-
Đối số đầu tiên là một data frame. Ở đây chúng ta sẽ dùng
home_data. -
Đối số thứ hai là ánh xạ từ các cột trong data frame sang các thuộc tính thẩm mỹ (aesthetics) của đồ thị. Ánh xạ này phải gọi hàm
aes(). Ở đây, chúng ta ánh xạ cột price lên trục x.
Cho đến giờ, mã của chúng ta là
ggplot(data = home_data, aes(x = price))
Đoạn này tự nó sẽ không vẽ được gì hữu ích. Để biến nó thành histogram, ta thêm lớp hình học histogram bằng geom_histogram().
ggplot(data = home_data, aes(x = price)) +
geom_histogram()

Thêm thống kê mô tả vào histogram bằng geom_vline()
Chúng ta có thể thêm thống kê mô tả vào biểu đồ bằng hàm geom_vline(). Hàm này thêm một đường thẳng đứng vào đồ thị.
Đầu tiên, ta tính một thống kê mô tả, ở đây là giá trung bình, bằng summarize() của dplyr.
price_stats <- home_data |>
summarize(mean_price = mean(price))
price_stats
# A tibble: 1 × 1
mean_price
<dbl>
1 540088.
Hàm nhận tham số xintercept, và các thuộc tính tùy chọn color và linewidth để tùy chỉnh màu và độ dày của đường. Chúng ta sẽ thêm đường trung bình bằng dấu cộng như ở phần trước.
ggplot(home_data, aes(x = price)) +
geom_histogram() +
geom_vline(aes(xintercept = mean_price), price_stats, color = "red", linewidth = 2)
Lưu ý rằng trong các hàm geom_, thứ tự đối số mapping và data bị đảo so với ggplot().

Vẽ mật độ xác suất thay vì đếm
Để thêm đường mật độ xác suất lên histogram, trước hết ta đổi trục y sang thang mật độ. Trong hàm aes(), đặt y thành after_stat(density).
Sau đó, ta có thể thêm một lớp mật độ vào đồ thị bằng hàm geom_density(). Ở đây, chúng ta đặt thuộc tính color là xanh lá và linewidth là 2.
ggplot(home_data, aes(x = price, y = after_stat(density))) +
geom_histogram() +
geom_vline(aes(xintercept = mean_price), price_stats, color = "red", linewidth = 2) +
geom_density(color = "green", linewidth = 2)

Lưu ý rằng các con số trên trục y đã thay đổi.
Hãy để ý cách mỗi lớp tuân theo cùng một mẫu: một dấu +, một lời gọi hàm và các đối số tùy chọn. Bạn có thể thêm các hàm geom_, thống kê và theme mà không cần học lại cú pháp cho từng tổ hợp.
Cập nhật chia thùng bằng bins
Chúng ta có thể cập nhật cách chia thùng của histogram ggplot2 bằng thuộc tính bins. Đặt thuộc tính này bằng số thùng bạn muốn hiển thị trên đồ thị. Việc này giúp bạn thấy dữ liệu chi tiết hơn hoặc gộp hơn trong histogram.
ggplot(data = home_data, aes(x = price)) +
geom_histogram(bins = 100)

Chúng ta cũng có thể đặt độ rộng thùng thủ công bằng thuộc tính binwidth của geom_histogram().
ggplot(data = home_data, aes(x = price)) +
geom_histogram(binwidth = 50000)

Cuối cùng, bạn có thể căn đường biên bằng các thuộc tính center hoặc boundary. Nếu bạn muốn ranh giới của các thùng rơi vào các bội số cụ thể, hãy dùng các thuộc tính này (chỉ dùng một trong hai). Để đảm bảo các thùng kết thúc ở giá trị nguyên, đặt thuộc tính bằng 1.
ggplot(data = home_data, aes(x = price)) +
geom_histogram(boundary = 1)

Tùy biến màu của histogram
Trong phần này, chúng ta sẽ thay đổi màu của histogram. Ta có thể tùy chỉnh màu viền của mỗi cột bằng thuộc tính color, và thay đổi màu tô của cột bằng thuộc tính fill của geom_histogram(). Chúng ta sẽ tô cột màu xanh dương và đổi màu viền thành trắng.
ggplot(data = home_data, aes(x = price)) +
geom_histogram(color = "white", fill = "blue")

Tùy biến màu của histogram ggplot2 theo nhóm
Bạn có thể tùy biến màu của các cột histogram.
Thay đổi thuộc tính fill (bên trong hàm aes()) sẽ đổi màu phần bên trong của các cột dựa trên giá trị của một biến trong bộ dữ liệu. Biến đó nên là biến phân loại (factor) thay vì số nguyên, nên ta có thể chuyển đổi bằng hàm factor(). Trong ví dụ này, chúng ta sẽ xem biến condition, có giá trị từ 1 (tình trạng kém) đến 5 (tình trạng rất tốt).
home_data <- home_data |>
mutate(condition = factor(condition))
ggplot(data = home_data, aes(x = price, fill = condition)) +
geom_histogram()

Thêm nhãn và tiêu đề bằng labs()
Tiếp theo, chúng ta thêm tiêu đề và nhãn cho đồ thị bằng hàm labs(). Đặt các thuộc tính x, y và title theo nhãn mong muốn.
ggplot(data = home_data, aes(x = price)) +
geom_histogram() +
labs(x ='Price (USD)', y='Number of Listings', title = 'Housing Price Distributions')

Đặt giới hạn trục x bằng xlim()
Chúng ta có thể đặt giới hạn trục x của đồ thị bằng hàm xlim() để phóng to vùng dữ liệu quan tâm. Ví dụ, đôi khi hữu ích khi tập trung vào phần trung tâm của phân phối thay vì phần đuôi dài như khi xem toàn bộ đồ thị.
Thay đổi giới hạn trục y cũng có thể thực hiện (bằng ylim()), nhưng điều này ít hữu ích cho histogram vì các giá trị tự động tính gần như luôn là tối ưu.
Chúng ta sẽ phóng to mức giá từ $0 đến $2M.
ggplot(home_data, aes(x = price)) +
geom_histogram(bins = 100) +
xlim(0, 2000000)

Thay đổi vị trí chú giải (legend)
Nếu muốn di chuyển chú giải trên đồ thị, chẳng hạn khi chúng ta tô màu khác nhau theo condition, có thể dùng hàm theme() và thuộc tính legend.position. Các giá trị legend.position nhận bao gồm “bottom”, “top”, “left” hoặc “right”. Bạn cũng có thể truyền tọa độ mong muốn của chú giải bằng c(x, y).
ggplot(home_data, aes(x = price, fill = condition)) +
geom_histogram() +
theme(legend.position = "bottom")
Dùng facets trong ggplot2
Cuối cùng, chúng ta có thể trực quan hóa dữ liệu theo các nhóm khác nhau trên những đồ thị riêng biệt bằng facets. Cách này sẽ chia trực quan hóa thành nhiều biểu đồ con cho từng hạng mục. Thực hiện bằng hàm facet_grid(). Dưới đây, chúng ta sẽ trực quan hóa phân phối giá theo các giá trị condition khác nhau.
ggplot(home_data, aes(x = price)) +
geom_histogram() + facet_grid(vars(condition))
Chủ đề faceting được trình bày chi tiết hơn trong hướng dẫn Facets cho ggplot trong R.

Kết luận
Để tạo histogram trong ggplot2, hãy xây nền bằng ggplot(), truyền data frame và ánh xạ aes(), rồi thêm geom_histogram(). Từ đó, xếp lớp các tùy biến: labs() cho nhãn trục, xlim() để thu phóng trục x và theme() để đổi vị trí chú giải hoặc điều chỉnh phong cách hiển thị.
ggplot2 được đề cập chuyên sâu trong lộ trình kỹ năng Data Visualization in R, bắt đầu với khóa Introduction to Data Visualization with ggplot2. Bạn có thể học cách kết hợp ggplot2 với các công cụ tidyverse khác trong lộ trình kỹ năng Tidyverse Fundamentals with R.
Để xem thêm các loại biểu đồ ggplot2 ngoài histogram, hãy xem hướng dẫn Graphics with ggplot2, và tải về ggplot2 cheat sheet để tham khảo nhanh.
Tác giả về Khoa học Dữ liệu | Chuyên viên Phân tích Tiếp thị Kỹ thuật Cấp cao tại Wayfair | Thạc sĩ Khoa học Dữ liệu tại University of Pennsylvania