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

Trực quan hóa dữ liệu biến đổi khí hậu với ggplot2: Hướng dẫn từng bước

Tìm hiểu cách sử dụng ggplot2 trong R để tạo các trực quan hóa thuyết phục về dữ liệu biến đổi khí hậu. Hướng dẫn từng bước này dạy bạn cách tìm, phân tích và trực quan hóa dữ liệu thời tiết lịch sử.
Đã cập nhật 5 thg 10, 2026  · 11 phút đọc

Khám phá cùng AI

ChatGPTClaudePerplexity

Hướng dẫn này là một đóng góp quý giá từ cộng đồng của chúng tôi và đã được DataCamp biên tập để đảm bảo rõ ràng và chính xác.

Muốn chia sẻ chuyên môn của riêng bạn? Chúng tôi rất muốn lắng nghe! Hãy gửi bài viết hoặc ý tưởng của bạn qua Biểu mẫu Đóng góp Cộng đồng.

"Nóng lên toàn cầu không phải là dự đoán. Nó đang xảy ra" - James Hansen

Biến đổi khí hậu là một vấn đề cấp bách ảnh hưởng đến tất cả chúng ta, và trực quan hóa dữ liệu có thể là công cụ mạnh mẽ để nâng cao nhận thức. Trong hướng dẫn từng bước này, bạn sẽ học cách sử dụng ggplot2 trong R để tạo các trực quan hóa có sức nặng từ dữ liệu khí hậu lịch sử. Kết thúc bài viết, bạn sẽ biết cách tìm bộ dữ liệu đã qua tuyển chọn, vẽ dữ liệu thời tiết lịch sử và tùy chỉnh biểu đồ để kể một câu chuyện thuyết phục.

Biến đổi khí hậu là một vấn đề cấp bách ảnh hưởng đến tất cả chúng ta, và trực quan hóa dữ liệu có thể là công cụ mạnh mẽ để nâng cao nhận thức. Trong hướng dẫn từng bước này, bạn sẽ học cách sử dụng ggplot2 trong R để tạo các trực quan hóa có sức nặng từ dữ liệu khí hậu lịch sử. Kết thúc bài viết, bạn sẽ biết cách tìm bộ dữ liệu đã qua tuyển chọn, vẽ dữ liệu thời tiết lịch sử và tùy chỉnh biểu đồ để kể một câu chuyện thuyết phục.

Trong hướng dẫn này, bạn sẽ học nơi tìm dữ liệu nhiệt độ lịch sử đáng tin cậy và đã được tuyển chọn, cũng như trực quan hóa dữ liệu đó với ggplot2.

  • Biết nơi tìm các bộ dữ liệu đã tuyển chọn với dữ liệu thời tiết lịch sử;
  • Tự tin vẽ dữ liệu thời tiết lịch sử bằng ggplot2;
  • Có thể tùy chỉnh biểu đồ ggplot2 để kể câu chuyện của bạn hiệu quả hơn.

Bước 1: Tìm và nạp dữ liệu

Dữ liệu cho hướng dẫn này có sẵn tại National Centers for Environmental Information (NCEI). NCEI là cơ quan hàng đầu về dữ liệu môi trường tại Hoa Kỳ và cung cấp dữ liệu chất lượng cao về khí hậu, hệ sinh thái và tài nguyên nước. Bộ dữ liệu Global Summary of the Year (GSOY) cung cấp dữ liệu thời tiết lịch sử theo thành phố và trạm đo. Trong hướng dẫn này, chúng ta sẽ sử dụng dữ liệu từ Berkeley, CA. Bạn có thể chọn thành phố ưa thích nếu muốn.

Dữ liệu sẽ được nạp bằng read_csv. Đối số đầu tiên là đường dẫn tệp, còn đối số thứ hai, col_select, cho R biết cột nào bạn muốn nạp. Lưu ý rằng bộ dữ liệu này có nhiều biến, nhưng chúng ta chỉ quan tâm đến "DATE" và "TAVG". "DATE" chứa năm quan trắc nhiệt độ và "TAVG" là nhiệt độ trung bình năm tính theo độ C. Để biết thêm về các biến có sẵn, vui lòng tham khảo sổ tay mã bộ dữ liệu.

library(readr)2​3df <- read_csv('USC00040693.csv',4            col_select = c("DATE", "TAVG"))5​Rows: 118 Columns: 2── Column specification ────────────────────────────────────────────────────────Delimiter: ","dbl (2): DATE, TAVG

Bên dưới, bạn sẽ in bộ dữ liệu và thống kê tóm tắt để có ấn tượng ban đầu về dữ liệu. Hàm R summary() cho biết dữ liệu trải từ 1893 đến 2019 và nhiệt độ trung bình năm tối thiểu quan sát được là 12,9 °C tại Berkeley, CA trong giai đoạn này. Nhiệt độ trung bình tối đa là 15,93 °C.

summary(df)      DATE           TAVG       Min.   :1893   Min.   :12.90   1st Qu.:1926   1st Qu.:13.50   Median :1956   Median :13.91   Mean   :1956   Mean   :13.97   3rd Qu.:1985   3rd Qu.:14.33   Max.   :2019   Max.   :15.93                  NA's   :33     

Bước 2: Xử lý giá trị thiếu

Hàm summary() cho thấy có 33 giá trị nhiệt độ bị thiếu. Bạn cũng có thể kiểm tra NA của một biến cụ thể bằng hàm is.na(), hàm này trả về TRUE nếu quan sát là NA. Sau đó, bạn có thể cộng tất cả giá trị thiếu. Hàm sum() chuyển TRUE thành 1.

print(paste("There are", sum(is.na(df$TAVG)), "missing values in this dataset."))[1] "There are 33 missing values in this dataset."

Vì chúng ta đang làm việc với chuỗi thời gian, chúng ta sẽ điền giá trị thiếu bằng nội suy tuyến tính. Phương pháp này giả định dữ liệu biến thiên tuyến tính trong khoảng thời gian bị thiếu. Thực tế, khi bạn vẽ chuỗi thời gian bằng biểu đồ đường, các khoảng giữa các quan sát, ngay cả khi không thiếu dữ liệu, cũng được nối bằng một đoạn thẳng giữa hai điểm.

Để thực hiện nội suy tuyến tính, chúng ta sẽ dùng gói imputeTS. Sau khi cài đặt và nạp thư viện, bạn có thể dùng na_interpolation() để điền các giá trị thiếu. Bạn truyền hai đối số: thứ nhất là cột dữ liệu bạn muốn xử lý, thứ hai là phương pháp bạn muốn dùng để bù (impute).

install.packages("imputeTS", quiet = TRUE)
library(imputeTS)Registered S3 method overwritten by 'quantmod':  method            from  as.zoo.data.frame zoo 
df$TAVG <- na_interpolation(df$TAVG, option ="linear")

Bước 3: Viết phiên bản đầu tiên của biểu đồ

Một trực quan hóa ggplot2 được xây dựng từ các lớp. Như trong hình dưới, mỗi lớp chứa một đối tượng geom, tức là một phần tử bạn thấy trên biểu đồ (ví dụ: đường và điểm).

Trước hết, bạn cần truyền một bộ dữ liệu vào hàm ggplot(). Tiếp theo, bạn sẽ ánh xạ các biến vào aesthetics - thuộc tính thị giác của đối tượng geom. Các thuộc tính này có thể là vị trí trên trục y, vị trí trên trục x, màu sắc, hoặc kích thước, v.v. Để biết thêm về ggplot, hãy xem khóa học Introduction to Data Visualization with ggplot2 của Rick Scavetta, từ đó tôi đã học được rất nhiều kỹ năng trực quan hóa dữ liệu.

Các lớp của ggplot2. Hình minh họa do Tác giả tạo.

Bên dưới, ánh xạ (aes()) của chúng ta yêu cầu ggplot đặt vị trí trên trục x phụ thuộc vào biến "DATE" và vị trí trên trục y phụ thuộc vào nhiệt độ. Lưu ý rằng nếu bạn chỉ vẽ lớp này, ggplot sẽ chỉ hiển thị các trục.

Ngoài ra, trước khi bắt đầu dùng ggplot, chúng ta sẽ đặt một số cấu hình toàn cục muốn áp dụng cho tất cả biểu đồ. Cấu hình thứ nhất là kích thước và độ phân giải biểu đồ. Cấu hình thứ hai là theme.

library(ggplot2)options(repr.plot.width = 10, repr.plot.height = 6, repr.plot.res = 150 )theme_set(theme_bw())
axes <- ggplot(data = df, aes(x = DATE, y = TAVG))axes

Bây giờ bạn có thể thêm lớp thứ hai với các điểm biểu thị nhiệt độ theo thời gian. Lưu ý rằng bạn có thể thêm lớp này vào biểu đồ đã tạo ở bước trước.

dot_plot <- axes + geom_point()dot_plot

Cuối cùng, bạn có thể thêm lớp thứ ba chứa các đường nối. Cần nhấn mạnh rằng một số tác giả cho rằng các đường này không đại diện cho dữ liệu quan sát và nên dùng cẩn trọng. Để có thảo luận đầy đủ, hãy xem chương 13 của Fundamentals of Data Visualization của Claus O. Wilke.

dot_plot +geom_line()

Bước 4: Tùy chỉnh biểu đồ

Trong phần này, bạn sẽ học cách tùy chỉnh biểu đồ để nó rõ ràng, nhiều thông tin và đẹp mắt.

Trước hết, để làm nổi bật mức tăng nhiệt độ, chúng ta sẽ ánh xạ thuộc tính màu của các điểm theo "TAVG". Vì đây là biến số, ggplot2 sẽ dùng thang màu chuyển sắc để biểu diễn giá trị liên tục. Bạn có thể chọn màu đại diện cho nhiệt độ thấp cũng như nhiệt độ cao với hàm scale_color_gradient().

Ngoài ra, bạn có thể đặt nhãn cho trục x và y với lần lượt xlab() và ylab(). Có thể thêm tiêu đề bằng ggtitle(). Cuối cùng, chúng ta sẽ tăng kích thước điểm và thêm độ trong suốt để dữ liệu chồng lấp dễ nhìn hơn.

ggplot(data = df, aes(x = DATE, y = TAVG, color = TAVG))+geom_point(size = 7, alpha = 0.8)+scale_color_gradient(name = "ºC", low = "#47BEFB", high = "#ED6AA8")+ggtitle("Historical air temperature trend in Berkeley, CA")+xlab("Year")+ylab("Annual Mean Temperature in Berkeley [ºC]")

Edward Tufte, chuyên gia trong lĩnh vực trực quan hóa dữ liệu, khuyến nghị tối đa hóa tỷ lệ “mực” dùng để hiển thị dữ liệu không dư thừa. Ông cho rằng điều này làm biểu đồ rõ ràng hơn và tránh gây xao nhãng cho người đọc.

Theme ggplot2 mà chúng ta đang dùng (theme_bw()) vốn đã phù hợp với khuyến nghị của Tufte, nhưng chúng ta vẫn có thể loại bỏ lưới trong biểu đồ trên. Để làm vậy, dùng hàm theme() và truyền hai đối số panel.grid.minor = element_blank() và panel.grid.major = element_blank().

ggplot(data = df, aes(x = DATE, y = TAVG, color = TAVG))+geom_point(size = 7, alpha = 0.8)+scale_color_gradient(name = "ºC", low =  "#47BEFB", high = "#ED6AA8")+ggtitle("Historical air temperature trend in Berkeley, CA")+xlab("Year")+ylab("Annual Mean Temperature in Berkeley [ºC]")+theme(# Eliminates grids:        panel.grid.minor = element_blank(),        panel.grid.major = element_blank())

Bước 5: Tạo một theme ggplot2 cho trực quan hóa của bạn

Bây giờ bạn sẽ học cách tạo theme ggplot2 của riêng mình. Là ví dụ, chúng ta sẽ tạo theme_datacamp() để khiến biểu đồ đồng bộ và hài hòa hơn với trang web DataCamp.

Đầu tiên, một danh sách với một số màu của DataCamp được tạo để dùng sau.

datacamp_colors <- list(green = "#74F065",                         darkblue = "#05192D",                         blue = "#47BEFB",                         pink = "#ED6AA8")

Tiếp theo, chúng ta sẽ nạp phông chữ Google tên "Manjari" để dùng trong theme. Bạn có thể dễ dàng nạp bằng gói "showtext". Nếu chưa có, vui lòng cài đặt.

install.packages("showtext", quiet = TRUE)

Bên dưới, chúng ta nạp gói và dùng hàm font_add_google() để nạp "Manjari". Chúng ta cũng yêu cầu R kết xuất văn bản bằng "showtext" với showtext_auto():

library(showtext)font_add_google("Manjari")showtext_auto()Loading required package: sysfontsLoading required package: showtextdb

Bây giờ, chúng ta sẽ dùng theme() để tùy chỉnh biểu đồ. Hình dưới cho thấy một số đối số bạn có thể dùng. Để xem danh sách đầy đủ, vui lòng tham khảo tài liệu tham khảo ggplot2.

 

Các đối số của theme. Hình minh họa do Tác giả tạo.

Bạn có thể tạo một theme mới bằng một hàm gọi hàm theme() của ggplot2 chứa các thiết lập tùy chỉnh của bạn. Lưu ý rằng chúng ta bắt đầu từ theme đen-trắng (theme_bw()) rồi loại bỏ lưới và thay đổi màu nền, panel và văn bản. Ngoài ra, thêm lề 0,5 cm cho biểu đồ. Để thuận tiện cho việc thay đổi sau này, hai đối số được tạo để người dùng chỉ định màu văn bản, panel và nền mong muốn.

theme_datacamp <- function(text_panel_color, background_color) {  theme_bw()+  theme(text=element_text(size=28, family="Manjari", face = "bold", color = text_panel_color),    	# Eliminates grids        panel.grid.minor = element_blank(),        panel.grid.major = element_blank(),    	# Changes panel, plot and legend background to dark blue        panel.background = element_rect(fill = background_color),        plot.background = element_rect(fill =  background_color),        legend.background = element_rect(fill= background_color),        # Changes legend texts color to white        legend.text =  element_text(color = text_panel_color,                                     margin = margin(0, 0, 0, -0.5, "cm")),        legend.title = element_text(color = text_panel_color),        legend.text.align = 0,        # Changes color of plot border to white        panel.border = element_rect(size = 1, color = text_panel_color),        # Changes color of axis texts to white        axis.text.x = element_text(color = text_panel_color),        axis.text.y = element_text(color = text_panel_color),        axis.title.x = element_text(color= text_panel_color),        axis.title.y = element_text(color= text_panel_color),        # Changes axis ticks color to white        axis.ticks.y = element_line(color = text_panel_color),        axis.ticks.x = element_line(color = text_panel_color),        # Adds margin        plot.margin = margin(1, 1, 1, 1, "cm")  )}

Bây giờ, bạn chỉ cần thêm theme_datacamp() vào biểu đồ, chỉ định màu ưa thích. Ở đây, tôi dùng màu của Datacamp:

ggplot(data = df, aes(x = DATE, y = TAVG, color = TAVG))+geom_point(size = 7, alpha = 0.8)+scale_color_gradient(name = "ºC", low = datacamp_colors$blue, high = datacamp_colors$pink)+ggtitle("Historical air temperature trend in Berkeley, CA")+xlab("Year")+ylab("Annual Mean Temperature in Berkeley [ºC]")+theme_datacamp(text_panel_color = datacamp_colors$green,                background_color = datacamp_colors$darkblue)

Cuối cùng, bạn có thể hiển thị xu hướng nhiệt độ bằng đường làm mượt LOESS (locally estimated scatterplot smoothing), như Claus O. Wilke khuyến nghị trong Chương 14 của Fundamentals of Data Visualization. Bạn có thể làm điều đó bằng cách thêm một lớp ggplot chứa phần tử geom_smooth().

ggplot(data = df, aes(x = DATE, y = TAVG, color = TAVG))+geom_point(size = 7, alpha = 0.8)+geom_smooth(color = datacamp_colors$green, se = FALSE)+scale_color_gradient(name = "ºC", low = datacamp_colors$blue, high = datacamp_colors$pink)+ggtitle("Historical air temperature trend in Berkeley, CA",       subtitle = "Visualization using theme_datacamp()")+xlab("Year")+ylab("Annual Mean Temperature in Berkeley [ºC]")+theme_datacamp(text_panel_color = datacamp_colors$green,                background_color = datacamp_colors$darkblue)

Hãy thoải mái thử các kết hợp màu và phông chữ khác để tạo ra trực quan hóa thuyết phục nhất. Ví dụ dưới đây, tôi đổi đường LOESS, panel và màu văn bản sang trắng.

ggplot(data = df, aes(x = DATE, y = TAVG, color = TAVG))+geom_point(size = 7, alpha = 0.8)+geom_smooth(color = "white", se = FALSE)+scale_color_gradient(name = "ºC", low = datacamp_colors$blue, high = datacamp_colors$pink)+ggtitle("Historical air temperature trend in Berkeley, CA",       subtitle = "Visualization using theme_datacamp()")+xlab("Year")+ylab("Annual Mean Temperature in Berkeley [ºC]")+theme_datacamp(text_panel_color = "white",                background_color = datacamp_colors$darkblue)

Kết luận

Trong hướng dẫn này, bạn đã học cách sử dụng ggplot2 trong R để trực quan hóa hiệu quả dữ liệu khí hậu lịch sử. Chúng ta đã đi qua mọi thứ từ tìm nguồn dữ liệu đáng tin cậy đến tạo theme ggplot2 tùy chỉnh, giúp bạn có kỹ năng nâng cao nhận thức về biến đổi khí hậu thông qua trực quan hóa dữ liệu.

Bước tiếp theo, hãy cân nhắc đào sâu hơn vào trực quan hóa dữ liệu và lập trình R với các khóa học Introduction to Data Visualization with ggplot2 và Intermediate R của DataCamp. Những khóa học này sẽ giúp bạn phát triển thêm các kỹ năng đã có và cho phép bạn xử lý các dự án phức tạp hơn.

Chủ đề
R
Phân tích dữ liệu
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