Chuyển đến nội dung chính

Biểu đồ Histogram ggplot2 trong R: Hướng dẫn đầy đủ kèm ví dụ

Học cách tạo và tùy biến histogram ggplot2 trong R, từ biểu đồ cơ bản đến biểu đồ tô màu, dùng facets và chồng đường mật độ.
Đã cập nhật 5 thg 10, 2026  · 7 phút đọc

Khám phá cùng AI

ChatGPTClaudePerplexity

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ọi ggplot() để vẽ histogram

  • Điều khiển số lượng thùng bằng bins hoặc kích thước thùng bằng binwidth trong geom_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 đặt y = after_stat(density)

  • Phân chia theo nhóm bằng fill = variable trong aes() hoặc dùng facet_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)

Những dòng đầu của bộ dữ liệu nhà ở với các cột price và condition

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

Histogram ggplot2 cơ bản của giá nhà

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().

Histogram ggplot2 với đường thẳng đứng màu đỏ biểu diễn giá trung bình được thêm bằng geom_vline()

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)

image4.png

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)

image12.png

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)

image5.png

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)

Histogram ggplot2 với ranh giới thùng được căn chỉnh bằng tham số boundary

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

Histogram ggplot2 với viền cột màu trắng và tô màu xanh dương

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

Histogram ggplot2 với các cột được tô màu theo hạng mục tình trạng nhà

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

Histogram ggplot2 với nhãn trục x, trục y và tiêu đề tùy chỉnh

Đặ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)

Histogram ggplot2 được phóng to vùng giá từ $0 đến $2M bằng xlim()

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.

image2.png

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.


Author
Kevin Babitz
LinkedIn

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

Chủ đề
R
Khoa học Dữ liệu
Trực quan hóa Dữ liệu

Học R với DataCamp!

Khóa học

Nhập môn trực quan hóa dữ liệu với ggplot2

4 giờ
191.2K
Học cách tạo ra các biểu đồ dữ liệu có ý nghĩa và đẹp mắt bằng ggplot2 thông qua việc nắm vững ngữ pháp đồ họa.
Xem chi tiếtRight Arrow
Bắt Đầu Khóa Học
Xem thêmRight Arrow
Liên quan

blog

Claude Opus 4.6: Tính năng, Điểm chuẩn, Bài kiểm tra thực hành và hơn thế nữa

Mô hình mới nhất của Anthropic dẫn đầu ở mã hóa tác tử và lập luận phức tạp. Thêm vào đó, nó có cửa sổ ngữ cảnh 1M.
Matt Crabtree's photo

Matt Crabtree

10 phút

Xem ThêmXem Thêm