Khóa học

R cho phép bạn tạo nhiều loại biểu đồ khác nhau, từ các dạng cơ bản như biểu đồ mật độ, biểu đồ chấm, hộp biểu đồ và biểu đồ phân tán, đến các dạng phức tạp hơn về mặt thống kê như biểu đồ xác suất.
Ngoài ra, bạn có thể chuyển từ việc tạo các biểu đồ cơ bản với rất ít tùy chỉnh sang vẽ các biểu đồ nâng cao với khả năng tùy biến đầy đủ kết hợp cùng đồ họa tương tác. Tuy vậy, không phải lúc nào chúng ta cũng nhận được kết quả mong muốn với biểu đồ trong R: Stack Overflow tràn ngập các câu hỏi về biểu đồ, với nhiều câu hỏi lặp lại.
Đó là lý do DataCamp quyết định tập hợp tất cả các câu hỏi thường gặp và những câu trả lời được đánh giá cao nhất vào một bài viết blog.
Để luyện tập tạo biểu đồ trong R, hãy thử khóa học trực quan hóa dữ liệu trong R này.
15 Câu Hỏi Về Biểu Đồ Trong R
1. Cách Vẽ Một Biểu Đồ R Trống
Mở Một Khung Biểu Đồ Mới
Bạn có thể mở một khung biểu đồ trống và kích hoạt thiết bị đồ họa trong R như sau:Lưu ý rằng các hàm plot.new() và frame() định nghĩa một khung biểu đồ mới mà không có trục, nhãn hay đường viền. Chúng cho biết sẽ tạo một biểu đồ mới: một cửa sổ đồ họa mới sẽ mở nếu bạn chưa có, còn nếu đã có thì cửa sổ hiện có sẽ được chuẩn bị để chứa biểu đồ mới. Bạn có thể đọc thêm về các hàm này tại đây.
Thiết Lập Kích Thước Cửa Sổ Đồ Họa
Bạn cũng có thể dùng hàm plot.window() để đặt kích thước ngang và dọc cho biểu đồ trống vừa tạo:
plot.new()
pWidth = 3
pHeight = 2
plot.window(c(0,pWidth),
c(0,pHeight))
Vẽ Một Biểu Đồ Trống Thực Sự
Bạn có thể vẽ một biểu đồ trống với hàm plot(). Ngoài ra, hãy bổ sung trục, nhãn trục và tiêu đề cho biểu đồ trống bằng các hàm mtext() và title().
Bạn cung cấp tọa độ (5,5) cho biểu đồ, nhưng không hiển thị việc vẽ điểm bằng cách đặt đối số type là "n".
Mẹo: thử đặt đối số này thành "p" hoặc "b" và xem điều gì xảy ra!
Thêm nữa, bạn không chú thích cho biểu đồ, nhưng bạn đặt giới hạn từ 0 đến 10 cho cả trục x và trục y.
Cuối cùng, bạn có thể chọn vẽ một khung bao quanh biểu đồ với hàm box() và thêm một số điểm bằng hàm points():
Lưu ý rằng bạn có thể đưa các tọa độ x và y vào các vector để vẽ nhiều điểm cùng lúc. Đối số pch cho phép bạn chọn ký hiệu, trong khi đối số cex nhận một giá trị cho biết mức độ phóng to/thu nhỏ của văn bản và ký hiệu so với mặc định.
Mẹo: nếu bạn muốn xem số nào ứng với ký hiệu nào, nhấp vào đây.
2. Cách Đặt Nhãn Trục Và Tiêu Đề Cho Biểu Đồ R
Các trục của biểu đồ R là một trong những chủ đề phổ biến nhất của các câu hỏi trên Stack Overflow; Những câu hỏi liên quan đến chủ đề này rất đa dạng.
Hãy tiếp tục đọc để xem những kiểu câu hỏi nào DataCamp thấy khá phổ biến!
Đặt Tên Trục (Với Chỉ Số Trên Hoặc Dưới) Và Thêm Tiêu Đề Cho Biểu Đồ R?
Bạn có thể dễ dàng đặt tên các trục và thêm tiêu đề để biểu đồ R của bạn cụ thể và dễ hiểu hơn với người xem.
Điều này có thể thực hiện dễ dàng bằng cách thêm các đối số main cho tiêu đề chính, sub cho tiêu đề phụ, xlab cho nhãn trục x và ylab cho nhãn trục y.
Lưu ý rằng nếu bạn muốn có tiêu đề với chỉ số trên hoặc dưới, bạn có thể thêm chúng vào đối số main của hàm plot() một cách dễ dàng. Hãy dùng expression() và ký hiệu ^ cho chỉ số trên hoặc dấu ngoặc vuông cho chỉ số dưới.
Hãy thử trong khối DataCamp Light dưới đây:
Bạn cũng có thể đảm bảo có chữ cái Hy Lạp trong nhãn trục bằng cách dùng đoạn mã kết hợp các hàm expression() và paste(). Chạy đoạn mã sau:
Điều Chỉnh Diện Mạo Của Nhãn Trục
Để điều chỉnh diện mạo nhãn trục x và y, bạn có thể dùng các đối sốcol.lab và cex.lab. Đối số thứ nhất dùng để thay đổi màu của nhãn trục x và y, trong khi đối số thứ hai dùng để xác định kích thước của nhãn trục x và y so với thiết lập (mặc định) của cex.
Để biết thêm thông tin về các đối số này, truy cập trang này.
Xóa Nhãn Trục Và Chú Thích Của Biểu Đồ
Nếu bạn muốn loại bỏ các giá trị trên trục của biểu đồ, trước tiên có thể thêm các đối số xaxt và yaxt, đặt là "n". Các đối số này nhận một ký tự chỉ định kiểu trục x. Nếu bạn truyền "n", như trong lệnh dưới đây, bạn có thể bỏ việc vẽ trục.
Lưu ý rằng nếu truyền bất kỳ ký tự nào khác cho các đối số xaxt và yaxt, các trục x và y sẽ được vẽ.
ann và đặt nó thành FALSE để đảm bảo mọi nhãn trục đều bị xóa.
Mẹo: chưa phải thông tin bạn cần? Hãy đến trang này.
Xoay Nhãn Trục Của Biểu Đồ
Bạn có thể thêm đối sốlas vào hàm axis() để xoay các con số tương ứng với mỗi trục:
Lưu ý cách mà điều này thực sự yêu cầu bạn thêm một đối số vào hàm plot() để chỉ ra rằng chưa vẽ trục nào: đây là nhiệm vụ của hai lời gọi hàm axis() tiếp theo.
Đối số las có thể có ba giá trị được gán cho nó. Tùy theo lựa chọn, vị trí nhãn sẽ khác nhau: nếu chọn 0, nhãn sẽ luôn song song với trục (mặc định); Nếu chọn 1, nhãn sẽ được đặt theo phương ngang. Chọn 2 nếu bạn muốn vuông góc với trục và 3 nếu bạn muốn đặt theo phương dọc.
Vẫn còn nữa. Nếu bạn muốn biết thêm về khả năng của hàm axis(), hãy tiếp tục đọc!
Di Chuyển Nhãn Trục Của Biểu Đồ R
Vậy, bạn muốn di chuyển các nhãn trục?
Đừng lo, bạn có thể làm điều này với hàm axis(); Như bạn có thể đã thấy trước đó trong hướng dẫn này, hàm này cho phép bạn chỉ định nơi muốn vẽ các trục. Giả sử bạn muốn vẽ trục x phía trên vùng biểu đồ và trục y bên phải nó.
Nhớ rằng nếu bạn truyền 1 hoặc 2 vào hàm axis(), trục sẽ được vẽ ở phía dưới và bên trái của vùng biểu đồ. Cuộn lên một chút để xem ví dụ trong đoạn mã trước!
3 và 4 vào hàm axis():
Như bạn thấy, đầu tiên, bạn vẽ x và y, nhưng bỏ qua trục và chú thích. Sau đó, bạn thêm các trục muốn hiển thị và chỉ định vị trí của chúng so với biểu đồ.
Tính linh hoạt mà hàm axis() mang lại cho bạn ngày càng nhiều! Xem câu hỏi thường gặp tiếp theo để biết còn có thể giải quyết gì với hàm R cơ bản này.
Mẹo: đến câu hỏi cuối để xem thêm cách di chuyển văn bản trong nhãn trục với hjust và vjust!
3. Cách Thêm Và Thay Đổi Khoảng Cách Dấu Gạch Trên Trục Của Biểu Đồ R
Cách Thay Đổi Khoảng Cách Dấu Gạch Trên Trục Của Biểu Đồ R
Để R tự quyết định dấu gạch trên trục có thể khá phiền, và sẽ có lúc bạn muốn điều chỉnh chúng.
1. Dùng hàm axis() để xác định dấu gạch trên trục của biểu đồ
Như bạn thấy, trước hết bạn xác định vị trí của các dấu gạch và nhãn của chúng. Sau đó, bạn vẽ biểu đồ, chỉ định kiểu trục x là "n" để không vẽ trục.
Rồi công việc chính bắt đầu:
- Hàm
axis()cho phép bạn chỉ định cạnh của biểu đồ nơi vẽ trục. Ở đây, đối số là1, nghĩa là trục sẽ vẽ ở phía dưới. Nếu giá trị là2, trục sẽ vẽ bên trái, còn3hoặc4tương ứng là phía trên hoặc bên phải; - Đối số
atcho phép bạn chỉ ra các điểm nơi cần vẽ dấu gạch. Ở đây, bạn dùng các vị trí đã định trongV1; - Tương tự, các
labelsbạn muốn dùng là những nhãn đã chỉ định trongV2; - Bạn điều chỉnh hướng của dấu gạch thông qua
tck: bằng cách truyền giá trị âm, bạn chỉ định các dấu gạch sẽ xuất hiện bên dưới trục.
Mẹo: thử truyền một giá trị dương cho đối số tck và xem điều gì xảy ra!
tcl và diện mạo của nhãn dấu gạch được điều khiển bởi cex.axis, col.axis và font.axis.
2. Dùng các hàm khác để xác định dấu gạch trên trục của biểu đồ R
Bạn cũng có thể dùng các hàm par() và plot() để định vị trí các dấu gạch và số khoảng giữa chúng.
xaxp, trong đó bạn truyền vị trí của các dấu gạch ở hai đầu trục x, theo sau là số khoảng giữa các dấu gạch:
Bạn cũng có thể chạy đoạn mã sau để về cơ bản có cùng kết quả:
Lưu ý rằng điều này chỉ hoạt động nếu bạn không dùng thang đo logarit. Nếu tọa độ log được bật, hay nói cách khác, nếu par(xlog=T), ba giá trị bạn truyền cho xaxp sẽ có ý nghĩa khác: với khoảng nhỏ, n là số âm. Ngược lại, n thuộc 1:3, chỉ ra số trường hợp, và x1, x2 là lũy thừa thấp nhất và cao nhất của 10 trong tọa độ người dùng, 10 ^ par("usr")[1:2].
Trong ví dụ này, bạn dùng hàm par(): bạn đặt xlog là TRUE và thêm đối số xaxp để cung cấp tọa độ của các dấu gạch ngoài cùng và số khoảng giữa chúng. Ở đây, bạn đặt giá trị nhỏ nhất là 1, giá trị lớn nhất là 4 và thêm rằng số khoảng giữa mỗi dấu gạch là 3.
Sau đó, bạn vẽ x và y, thêm đối số log để chỉ định có vẽ trục x hoặc y hoặc cả hai theo thang log hay không. Bạn có thể truyền các giá trị "x", "y" và "xy" cho đối số log để làm điều này.
Cách Thêm Dấu Gạch Nhỏ Cho Biểu Đồ R
Bạn có thể nhanh chóng thêm các dấu gạch nhỏ cho biểu đồ với hàmminor.tick() từ gói Hmisc:
- Đối số
nxcho phép bạn chỉ định số khoảng muốn chia giữa các dấu gạch lớn trên trục. Nếu truyền giá trị1, các dấu gạch nhỏ sẽ bị loại bỏ; nycho phép bạn làm điều tương tự nhưnx, nhưng cho trục y;tick.ratiocho biết tỷ lệ độ dài giữa dấu gạch nhỏ và dấu gạch lớn. Độ dài của dấu gạch lớn lấy từpar(tck=x).
4. Cách Tạo Hai Trục X Hoặc Y Khác Nhau
Tùy chọn đầu tiên là tạo biểu đồ thứ nhất và gọi hàmpar() với đối số new đặt là TRUE để ngăn R xóa thiết bị đồ họa:
Sau đó, bạn tạo biểu đồ thứ hai với plot(). Truyền dữ liệu vào, và đảm bảo điều chỉnh một số đối số như type, axes, bty, xlab và ylab:
type: bạn có thể truyềnlđể vẽ bằng đường;axesđặt làFALSEđể không vẽ trục;btyẩn việc vẽ khung quanh biểu đồ;xlabđặt là chuỗi rỗng, tức là không có nhãn trên trục x, vàylabcũng đặt là chuỗi rỗng, nên trục y cũng không có nhãn.
Xem tất cả trong khối DataCamp Light sau. Lưu ý rằng đoạn mã phía trên đã được nạp sẵn vào môi trường làm việc của bạn. Bạn có thể kiểm tra bằng bảng điều khiển R ở bên phải hộp DataCamp Light:
Tiếp theo, đến lúc thêm một trục và ghi chữ vào lề biểu đồ với axis() và mtext() tương ứng.
Bạn có thể thêm một trục mới ở bên phải bằng cách thêm đối số side và gán giá trị 4 cho hàm axis(). Sau đó, bạn chỉ định đối số at để cho biết các điểm cần vẽ dấu gạch. Ở đây, bạn tính một dãy gồm n+1 giá trị “đẹp” cách đều bao phủ khoảng giá trị trong z với hàm pretty(). Điều này đảm bảo bạn thực sự có các số từ trục y của biểu đồ thứ hai, mà bạn đã đặt tên là z.
Hãy thử tất cả dưới đây:
Lưu ý rằng đối số side có thể nhận ba giá trị: 1 để đặt chữ ở dưới, 2 ở bên trái, 3 ở trên và 4 để đặt chữ ở bên phải. Đối số line cho biết dòng lề mà chữ bắt đầu.
Kết quả cuối cùng của đoạn mã của bạn sẽ như sau:
set.seed(101)
x <- 1:10
y <- rnorm(10)
z <- runif(10, min=1000, max=10000)
plot(x, y)
par(new = TRUE)
plot(x,
z,
type = "l",
axes = FALSE,
bty = "n",
xlab = "",
ylab = "")
axis(side=4,
at = pretty(range(z)))
mtext("z",
side=4,
line=3)
Bài tập thêm: hãy thử dựng một biểu đồ R với hai trục x khác nhau! Thực hiện điều này trong khối DataCamp Light dưới đây:
Lưu ý rằng, dù bạn có thể tự làm thủ công tất cả điều này với các hàm cơ bản plot(), axis() và mtext(), vẫn có các gói tự động hóa: hàm twoord.plot() của gói plotrix và hàm doubleYScale() của gói latticeExtra khá tiện và có lẽ nhanh hơn nếu bạn muốn làm điều tương tự:
Lưu ý rằng ví dụ trên được tạo với bộ dữ liệu này. Nếu bạn còn băn khoăn về việc nhập dữ liệu hay hàm read.table(), hãy xem hướng dẫn của DataCamp về nhập dữ liệu trong R.
5. Cách Thêm Hoặc Thay Đổi Chú Giải (Legend) Của Biểu Đồ R
Thêm Và Thay Đổi Chú Giải Của Biểu Đồ R Với R Cơ Bản
Bạn có thể dễ dàng thêm chú giải vào biểu đồ R với hàmlegend():
Lưu ý rằng các đối số pt.cex và title.cex được mô tả trong tài liệu của legend() thực ra không hoạt động tốt. Có một số cách xử lý:
- Đặt tiêu đề hoặc nhãn của chú giải bằng phông khác bằng cách thêm đối số
text.fontvàolegend():
- Vẽ chú giải hai lần với các giá trị đối số
cexkhác nhau
Mẹo: nếu bạn quan tâm đến các màu có thể dùng trong R, hãy xem tài liệu PDF rất hữu ích này.
Cách Thêm Và Thay Đổi Chú Giải Và Nhãn Của Biểu Đồ R Trong ggplot2
Việc thêm chú giải vào biểu đồ ggplot2 khá dễ. Bạn chỉ cần chạy lệnh sau:
Và nó sẽ tạo một chú giải mặc định. Nhưng trong hầu hết trường hợp, bạn sẽ muốn điều chỉnh diện mạo chú giải thêm nữa.
Có hai cách để thay đổi tiêu đề và nhãn của chú giải trong ggplot2:
- Bảo với thang đo dùng tiêu đề và nhãn khác
colour hoặc shape, hay các thẩm mỹ khác, bạn cần đổi tên và nhãn thông qua các hàm scale_color_discrete() và scale_shape_discrete() tương ứng:
Lưu ý rằng biểu đồ trông hơi bị bó trong thẻ Plot của khối DataCamp Light, nhưng điều này sẽ không thành vấn đề nếu bạn chạy mã trong RStudio.
Lưu ý rằng bạn có thể tạo hai chú giải nếu bạn thêm đối số shape vào hàm geom_point() và vào các đối số labels!
Nếu bạn muốn chuyển chú giải xuống dưới biểu đồ, bạn có thể đặt legend.position là "bottom". Mặt khác, đối số legend.justification cho phép bạn đặt chú giải bên trong biểu đồ.
Mẹo: xem đủ loại thang đo có thể dùng để báo cho ggplot biết nên dùng tên và nhãn khác tại đây.
- Thay đổi khung dữ liệu để factor có dạng mong muốn
Sau đó bạn có thể dùng các tên factor mới để vẽ biểu đồ trong ggplot2, tránh việc phải “động chạm” đổi tên và nhãn bằng các dòng mã phụ trong quá trình vẽ.
Mẹo: để xem một tờ phao đầy đủ về ggplot2, bạn có thể đến đây.
6. Cách vẽ lưới trong biểu đồ R của bạn
Vẽ lưới trong biểu đồ R với Basic R
Với một số mục đích, bạn có thể thấy cần thêm lưới vào biểu đồ. Bạn có thể dễ dàng thêm lưới bằng hàmgrid():
Vẽ lưới trong biểu đồ R với ggplot2
Khối mã dưới đây cho bạn thấy cách đảm bảo biểu đồ có lưới với gói ggplot2. Lưu ý rằng dữ liệu chol đã được nạp sẵn và các bước xử lý dữ liệu ở trên đã được áp dụng.
Nếu bạn chưa chắc dữ liệu trông như thế nào, hãy in ra vài dòng đầu của data frame trong R Console của khối DataCamp Light:
Mẹo: nếu bạn không muốn có các đường lưới phụ, chỉ cần truyền element_blank() vào panel.grid.minor.
Nếu bạn muốn tô màu nền, hãy thêm panel.background = element_rect(fill = "navy") vào mã của bạn. Bạn có thể xem cách thực hiện trong khối DataCamp Light bên dưới. Dữ liệu chol đã được nạp và xử lý nhẹ, giống như trước. Hãy tự thử nghiệm!
7. Cách vẽ biểu đồ với PNG làm nền
Bạn có thể nhanh chóng vẽ một biểu đồ với tệp .png làm nền nhờ gói png. Hãy cài đặt gói nếu cần, kích hoạt để sử dụng trong không gian làm việc qua hàm library() và bạn có thể bắt đầu vẽ!
Đầu tiên, bạn cần nạp ảnh. Dùng hàm readPNG() để chỉ định đường dẫn đến bức ảnh!
mẹo: bạn có thể kiểm tra thư mục làm việc hiện tại và thay đổi nó bằng cách chạy các lệnh sau.
Nếu ảnh được lưu trong thư mục làm việc, bạn chỉ cần ghi readPNG("picture.png") thay vì truyền toàn bộ đường dẫn.
Tiếp theo, bạn thiết lập vùng vẽ và gọi hàm par() để đặt các tham số đồ họa trong rasterImage(). Bạn dùng đối số usr để xác định biên của hệ tọa độ người dùng của vùng vẽ. Trong ví dụ này, bạn đặt 1, 3, 2 và 4.
Sau đó, bạn vẽ một lưới và thêm vài đường:
install.packages("png")
library(png)
image <- readPNG("<path to your picture>")
getwd()
setwd("<path to a folder>")
plot(1:2, type='n', main="Plotting Over an Image", xlab="x", ylab="y")
lim <- par()
rasterImage(image, lim$usr[1], lim$usr[3], lim$usr[2], lim$usr[4])
grid()
lines(c(1, 1.2, 1.4, 1.6, 1.8, 2.0), c(1, 1.3, 1.7, 1.6, 1.7, 1.0), type="b", lwd=5, col="red")
Điều này có thể cho ra kết quả sau nếu bạn dùng logo DataCamp:
library(png)
image <- readPNG("datacamp.png")
plot(1:2, type="n", main="Plotting Over an Image", xlab="x", ylab="y", asp=1)
lim <- par()
rasterImage(image, lim$usr[1], lim$usr[3], lim$usr[2], lim$usr[4])
lines(c(1, 1.2, 1.4, 1.6, 1.8, 2.0), c(1.5, 1.3, 1.7, 1.6, 1.7, 1.0), type="b", lwd=5, col="red")

Lưu ý rằng bạn cần cung cấp tệp .png làm đầu vào cho readPNG() và nếu muốn, bạn cũng có thể làm tương tự với ảnh jpg. Tất nhiên, khi đó bạn cần nạp thư viện jpeg!
Lưu ý trong ví dụ này, bạn tải một ảnh từ web về để dùng trong biểu đồ, nhưng bạn cũng có thể chỉ cần lưu một ảnh và truyền đường dẫn tệp vào readJPEG() để dùng khi vẽ.
Cũng lưu ý rằng ví dụ này được lấy từ R Graph Gallery, nơi cung cấp rất nhiều cảm hứng cho trực quan hóa dữ liệu R, vì bạn có thể tìm cả mã và bản vẽ ở cùng một nơi! Rất lý tưởng khi bạn cần cảm hứng hoặc cách nhanh chóng để tìm đoạn mã cần cho biểu đồ của mình!
8. Cách chỉnh kích thước điểm trong biểu đồ R
Chỉnh kích thước điểm trong biểu đồ R với Basic R
Để chỉnh kích thước điểm với Basic R, bạn có thể đơn giản dùng đối sốcex:
symbols():
Các hình tròn trong biểu đồ này nhận giá trị của df$x3 làm bán kính, trong khi đối số inches điều khiển kích thước ký hiệu. Khi đối số này nhận một số dương, các ký hiệu sẽ được co giãn sao cho kích thước lớn nhất bằng giá trị này (tính theo inch).
Chỉnh kích thước điểm trong biểu đồ R của bạn với ggplot2
Trong trường hợp này, bạn sẽ muốn chỉnh kích thước điểm trong biểu đồ phân tán. Bạn có thể làm điều này với đối số size. Lưu ý rằng dữ liệu chol đã được nạp sẵn cho bạn:
Lưu ý rằng bạn cũng có thể truyền đối số size vào hàm geom_point():
ggplot(chol,
aes(x=chol$WEIGHT, y=chol$HEIGHT)) +
geom_point(size = 2)
Bạn sẽ nhận được cùng một kết quả, nhưng đừng chỉ tin lời tôi! Hãy thử thay đoạn mã cuối trong khối DataCamp Light bằng khối mã này.
9. Cách khớp một đường cong trơn cho dữ liệu R của bạn
Hàm loess() có lẽ là giải pháp ưa thích của mọi lập trình viên R cho kiểu câu hỏi này. Thực chất, nó “khớp một bề mặt đa thức được xác định bởi một hoặc nhiều biến dự báo số, sử dụng phép khớp cục bộ”.
Tóm lại, bạn có dữ liệu và dùng hàm loess(), trong đó bạn liên hệ y với x. Qua đó, bạn chỉ định biến phản hồi dạng số và từ một đến bốn biến dự báo dạng số.
x và y rồi vẽ các đường lên biểu đồ gốc tại nơi bạn dự đoán các giá trị của lo:
10. Cách thêm thanh sai số (Error Bars) trong biểu đồ R
Vẽ thanh sai số với Basic R
Tin xấu: R không thể vẽ thanh sai số ngay lập tức. Tin tốt: bạn vẫn có thể vẽ thanh sai số mà không cần cài đặt thêm gói!
Trước tiên, bạn sẽ cần định nghĩa hàm sau để tính một số thống kê tóm tắt của data frame:
summarySE <- function(data=NULL, measurevar, groupvars=NULL, na.rm=FALSE,
conf.interval=.95, .drop=TRUE) {
library(plyr)
# New version of length which can handle NA's: if na.rm==T, don't count them
length2 <- function (x, na.rm=FALSE) {
if (na.rm) sum(!is.na(x))
else length(x)
}
# This does the summary. For each group's data frame, return a vector with
# N, mean, and sd
datac <- ddply(data, groupvars, .drop=.drop,
.fun = function(xx, col) {
c(N = length2(xx[[col]], na.rm=na.rm),
mean = mean (xx[[col]], na.rm=na.rm),
sd = sd (xx[[col]], na.rm=na.rm)
)
},
measurevar
)
# Rename the "mean" column
datac <- rename(datac, c("mean" = measurevar))
datac$se <- datac$sd / sqrt(datac$N) # Calculate standard error of the mean
# Confidence interval multiplier for standard error
# Calculate t-statistic for confidence interval:
# e.g., if conf.interval is .95, use .975 (above/below), and use df=N-1
ciMult <- qt(conf.interval/2 + .5, datac$N-1)
datac$ci <- datac$se * ciMult
return(datac)
}
Lưu ý rằng định nghĩa hàm được lấy từ nguồn này và cũng có sẵn qua thư viện Rmisc.
Tiếp theo, bạn có thể dùng hàm này để tính một số thống kê của dữ liệu chol, vốn đã được nạp sẵn. Sau đó, bạn có thể dùng các con số thu được để vẽ biểu đồ.
Hãy kiểm tra dữ liệu trước khi bắt đầu bài tập này!
Nếu bạn muốn xem tất cả các đối số mà arrows() có thể nhận, hãy vào đây.
Vẽ thanh sai số với ggplot2
Thanh sai số biểu diễn sai số chuẩn của trung bình
Trước tiên, hãy tóm tắt dữ liệu của bạn bằng hàm summarySE() từ gói Rmisc hoặc dùng hàm đã định nghĩa ở trên. Sau đó, bạn có thể dùng data frame thu được để vẽ một số biến và đồng thời vẽ các thanh sai số cho chúng, ví dụ với sai số chuẩn của trung bình.
position_dodge():
Mẹo: nếu bạn gặp lỗi như “geom_path: Each group consist of only one observation. Do you need to adjust the group aesthetic?”, thường là bạn cần điều chỉnh thuộc tính group.
Thanh sai số biểu diễn khoảng tin cậy
Tiếp tục từ phần tóm tắt dữ liệu mà bạn đã tạo với hàm summarySE() của thư viện Rmisc hoặc ở mục trước, bạn cũng có thể vẽ các thanh sai số biểu diễn khoảng tin cậy. Ở đây, biểu đồ với các thanh sai số mức tin cậy 95% được vẽ.
Lưu ý cách màu của các thanh sai số hiện được đặt thành màu đen với đối số colour.
Thanh sai số biểu diễn độ lệch chuẩn
Cuối cùng, bạn cũng có thể dùng kết quả của hàm summarySE() trong gói Rmisc hoặc từ định nghĩa hàm mà bạn đã sao chép ở một trong các mục trước để vẽ các thanh sai số biểu diễn độ lệch chuẩn.
Cụ thể, bạn chỉ cần điều chỉnh các đối số ymin và ymax mà bạn truyền vào geom_errorbar():
Mẹo lớn*: hãy xem thêm trang này để có các ví dụ chi tiết hơn về cách vẽ trung bình và thanh sai số.
11. Cách lưu biểu đồ thành ảnh trên đĩa
Bạn có thể dùng dev.copy() để sao chép biểu đồ của bạn, được tạo trên thiết bị đồ họa hiện tại, sang thiết bị hoặc thư mục mà bạn chỉ định.
x <- seq(0,2*pi,0.1)
y <- sin(x)
plot(x,y)
dev.copy(jpeg,
filename="<path to your file/name.jpg>");
dev.off();
(x)
(y)
12. Cách vẽ hai biểu đồ R cạnh nhau
Vẽ hai biểu đồ cạnh nhau bằng R cơ bản
Bạn có thể làm điều này với các lệnh R cơ bản:Bằng cách thêm hàm par() với đối số mfrow, bạn chỉ định một vector, trong trường hợp này gồm 1 và 2: tất cả hình sẽ được vẽ trong một mảng 1x2 trên thiết bị theo hàng (mfrow).
Nói cách khác, các boxplot phía trên sẽ được in trên một hàng gồm hai cột.
Vẽ hai biểu đồ cạnh nhau bằng ggplot2
Nếu bạn muốn đặt các biểu đồ cạnh nhau và không muốn tự đặt giới hạn, bạn có thể cân nhắc dùng gói ggplot2 để vẽ các biểu đồ cạnh nhau.
Dữ liệu của bạn chol và hàm summarySE() đã được nạp sẵn. Hãy kiểm tra chúng trong R Console nếu bạn chưa rõ trông chúng như thế nào:
Lưu ý cách bạn chỉ cần thêm hàm facet_grid() để chỉ ra rằng bạn muốn hai biểu đồ đặt cạnh nhau. Yếu tố được dùng để quyết định cách các biểu đồ được vẽ là MORT, như bạn có thể thấy ở trên!
Vẽ nhiều biểu đồ cạnh nhau bằng gridExtra
Để in các biểu đồ cạnh nhau, bạn có thể dùng gói gridExtra; Hãy đảm bảo bạn đã cài và kích hoạt gói trong không gian làm việc, rồi chạy lệnh như sau:
Lưu ý lần nữa rằng bạn quyết định cách hai biểu đồ hiển thị nhờ đối số ncol.
Vẽ nhiều biểu đồ cạnh nhau bằng lattice
Tương tự cách làm với gói ggplot2, gói lattice cũng không yêu cầu bạn chỉ định giới hạn hay cách bạn muốn in các biểu đồ cạnh nhau.
Thay vào đó, bạn dùng bwplot() để tạo các biểu đồ trellis với kiểu đồ thị là box plot. Biểu đồ trellis hiển thị một biến hoặc mối quan hệ giữa các biến, có điều kiện theo một hoặc nhiều biến khác.
Trong trường hợp này, nếu bạn dùng bộ dữ liệu chol (bạn có thể tìm tại đây hoặc nạp bằng hàm read.table()), bạn sẽ hiển thị biến CHOL riêng biệt cho từng tổ hợp mức của các nhân tố SMOKE và MORT.
Lưu ý dữ liệu đã được nạp sẵn cho bạn trong khối DataCamp Light dưới đây!
Vẽ các biểu đồ cạnh nhau với gridBase
Một cách khác để đặt hai biểu đồ cạnh nhau là dùng gói gridBase, gói này xử lý “tích hợp đồ họa base và grid”. Cách này hữu ích khi bạn muốn đặt một biểu đồ R cơ bản và một ggplot cạnh nhau.
Cách làm như sau: trước hết, kích hoạt các gói cần thiết trong không gian làm việc. Ở đây, bạn cần sẵn sàng gridBase để đặt hai biểu đồ cạnh nhau, và grid cùng ggplot2 để thực sự tạo biểu đồ:
library(grid)
library(gridBase)
library(ggplot2)
plot.new()
gl <- grid.layout(nrow=1,
ncol=2)
vp.1 <- viewport(layout.pos.col=1,
layout.pos.row=1)
vp.2 <- viewport(layout.pos.col=2,
layout.pos.row=1)
pushViewport(viewport(layout=gl))
pushViewport(vp.1)
par(new=TRUE,
fig=gridFIG())
plot(x = 1:10,
y = 10:1)
popViewport()
pushViewport(vp.2)
ggplotted <- qplot(x=1:10,y=10:1, 'point')
print(ggplotted, newpage = FALSE)
popViewport(1)
Nếu muốn và cần, bạn có thể bắt đầu bằng một biểu đồ trống rồi thiết lập bố cục. Lưu ý rằng vì bạn muốn hai biểu đồ được tạo cạnh nhau, bạn cần tạo một bố cục lưới gồm một hàng và hai cột.
Giờ bạn muốn lấp đầy các ô của lưới bằng các viewport. Chúng xác định các vùng hình chữ nhật trên thiết bị đồ họa với sự trợ giúp của các tọa độ trong các vùng đó. Trong trường hợp này, thuận tiện hơn nhiều khi dùng các thông số của lưới như vừa mô tả ở trên thay vì tọa độ x hoặc y thực. Đó là lý do bạn nên dùng các đối số layout.pos.col và layout.pos.row.
Vì các viewport chỉ là mô tả hoặc định nghĩa, các đối tượng kiểu này cần được “đẩy” vào cây viewport trước khi bạn thấy bất kỳ hiệu ứng nào trên hình vẽ. Bạn nên dùng hàm pushViewport() để thực hiện điều này.
Giờ bạn có thể tiếp tục thêm vùng chữ nhật đầu tiên vp.1 vào cây ViewPort, sau đó báo cho R bằng gridFig() vẽ một biểu đồ base trong một viewport của grid (tức vp.1). Đối số fig thường nhận các tọa độ của vùng hình vẽ trong vùng hiển thị của thiết bị. Ở đây, bạn dùng đối số fig để bắt đầu một biểu đồ mới, thêm nó vào một biểu đồ hiện có bằng cách thêm new = TRUE trong hàm par(). Bạn vẽ đồ họa base và loại bỏ viewport khỏi cây:
plot.new()
gl <- grid.layout(nrow=1,
ncol=2)
vp.1 <- viewport(layout.pos.col=1,
layout.pos.row=1)
vp.2 <- viewport(layout.pos.col=2,
layout.pos.row=1)
pushViewport(viewport(layout=gl))
pushViewport(vp.1)
par(new=TRUE,
fig=gridFIG())
plot(x = 1:10,
y = 10:1)
popViewport()
Vì bạn muốn hai biểu đồ được tạo cạnh nhau, bạn sẽ đặt một biểu đồ ở cột thứ nhất và biểu đồ còn lại ở cột thứ hai, cả hai đều nằm trên hàng thứ nhất.
Lưu ý rằng hàm pushViewport() nhận hàm viewport(), bản thân nó chứa đối số layout. Đối số này chỉ ra “một đối tượng bố cục lưới chia viewport thành các vùng con”.
Cũng lưu ý rằng bạn có thể chỉ định trong hàm popViewport() một đối số để chỉ ra số lượng viewport bạn muốn loại khỏi cây. Nếu giá trị này là 0, điều đó có nghĩa là bạn muốn loại bỏ các viewport cho đến tận viewport gốc. Giá trị mặc định của đối số này là 1.
Hãy thêm vùng chữ nhật thứ hai vp.2 vào cây ViewPort. Sau đó bạn có thể tạo ggplot và loại viewport khỏi cây.
pushViewport(vp.2)
ggplotted <- qplot(x=1:10,
y=10:1,
'point')
print(ggplotted,
newpage = FALSE)
popViewport(1)
Lưu ý rằng bạn cần in (print) đối tượng đồ họa được tạo bởi qplot() để thực sự vẽ và hiển thị nó. Đồng thời, bạn cũng cần đặt newpage = FALSE, nếu không bạn sẽ chỉ thấy qplot()…
Thêm nữa, hãy nhớ rằng giá trị mặc định của số viewport cần loại trong hàm popViewport() là 1. Điều này khiến việc ghi popViewport(1) trong mã trở nên hơi dư thừa.
13. Cách vẽ nhiều đường hoặc điểm
Dùng R cơ bản để vẽ nhiều đường hoặc điểm trong cùng một biểu đồ
Để vẽ hai hoặc nhiều đồ thị trên cùng một biểu đồ, về cơ bản bạn bắt đầu bằng cách tạo một biểu đồ cơ bản điển hình trong R. Sau đó, bạn thêm nhiều đường hoặc điểm vào biểu đồ. Trong trường hợp này, bạn thêm nhiều đường, nên bạn sẽ xác định thêm các trục y:Tiếp theo, bạn thấy rằng các đường này được vẽ bằng hàm lines().
Điều này cho kết quả như sau:
Lưu ý rằng hàm lines() nhận ba đối số: trục x và trục y bạn muốn vẽ, và màu (được biểu diễn bằng đối số col) mà bạn muốn dùng để vẽ. Bạn cũng có thể thêm các thuộc tính sau:
| Tính năng | Đối số | Giá trị nhập |
|---|---|---|
| Kiểu đường | lty |
Số nguyên hoặc chuỗi ký tự |
| Bề rộng đường | lwd |
Số nguyên |
| Kiểu ký hiệu vẽ | pch |
Số nguyên hoặc ký tự đơn |
| Kiểu đầu mút đường | lend |
Số nguyên hoặc chuỗi |
| Kiểu nối đoạn | ljoin |
Số nguyên hoặc chuỗi |
| Giới hạn góc mài (mitre) | lmitre |
Số nguyên < 1 |
Ví dụ về các đối số này như sau:
lines(x,y2,col="green", lty = 2, lwd = 3)
lines(x,y2,col="green", lty = 5, lwd = 2, pch = 2)
lines(x,y3,col="black", lty = 3, lwd = 5, pch = 3, lend = 0, ljoin = 2)
lines(x,y4,col="blue", lty = 1, lwd = 2, pch = 3, lend = 2, ljoin = 1, lmitre = 2)
Lưu ý rằng đối số pch không hoạt động tốt với hàm lines() và tốt nhất nên chỉ dùng với points().
points():
Bạn có thể thêm các đối số tương tự vào hàm points() như đã làm với hàm lines() và được liệt kê ở trên. Tuy nhiên, có một vài bổ sung:
| Tính năng | Đối số | Giá trị nhập |
|---|---|---|
| Màu nền (tô) | bg |
Chỉ khi pch = 21:25 |
| Độ nở ký tự (biểu tượng) | cex |
Số nguyên |
Ví dụ mã cho các đối số này như sau:
points(x,y4,col="blue", pch=21, bg = "red")
points(x, y5, col="yellow", pch = 5, bg = "blue")
Nếu bạn thêm các thay đổi này vào biểu đồ ở trên, bạn sẽ nhận được kết quả như sau:
Dùng ggplot2 để vẽ nhiều đường hoặc điểm trong một biểu đồ R
Gói ggplot2 cũng rất tiện lợi khi cho phép bạn tạo các lớp (layer), nhờ đó bạn có thể vẽ hai hoặc nhiều đồ thị trên cùng một biểu đồ R mà không gặp khó khăn và khá dễ dàng:
14. Cách cố định tỷ lệ khung hình (aspect ratio) cho biểu đồ R
Nếu bạn muốn lưu biểu đồ R thành ảnh trong đó các trục tỷ lệ thuận với kích thước của chúng, đó là dấu hiệu bạn muốn cố định tỷ lệ khung hình.
Điều chỉnh tỷ lệ khung hình với R cơ bản
Khi bạn dùng các lệnh R cơ bản để tạo biểu đồ, bạn có thể thêm đối sốasp của hàm plot(), kèm một số nguyên, để đặt tỷ lệ khung hình. Xem ví dụ đầu tiên này khi chưa định nghĩa tỷ lệ khung hình:
asp:
Điều chỉnh tỷ lệ khung hình cho biểu đồ với ggplot2
Để cố định tỷ lệ khung hình cho các biểu đồ ggplot2, bạn chỉ cần thêm hàm coord_fixed(), hàm này cung cấp “hệ tọa độ có tỉ lệ cố định [buộc] một tỷ lệ xác định giữa đơn vị dữ liệu được biểu diễn trên các trục”.
Nói cách khác, hàm này cho phép bạn chỉ định số đơn vị trên trục y tương đương với một đơn vị trên trục x. Mặc định luôn là 1, nghĩa là một đơn vị trên trục x có cùng độ dài với một đơn vị trên trục y. Nếu tỷ lệ đặt cao hơn, đơn vị trên trục y dài hơn đơn vị trên trục x và ngược lại.
So sánh các ví dụ sau:Điều chỉnh tỷ lệ khung hình cho biểu đồ với MASS
Bạn cũng có thể cân nhắc dùng gói MASS, gói này có hàm eqscplot(): nó tạo các biểu đồ với tỉ lệ hình học bằng nhau. Hàm này áp dụng cho scatterplot:
Mẹo: bạn có thể nên bắt đầu một khung biểu đồ mới trước khi chạy đoạn mã trên!
Lưu ý rằng bạn có thể truyền thêm các đối số cho hàm eqscplot() để tùy chỉnh giao diện của scatterplot!
15. Chức năng của hjust và vjust trong ggplot2 là gì
Về cơ bản, bạn dùng các đối số này khi muốn đặt vị trí văn bản trong ggplot. hjust cho phép bạn xác định căn lề ngang, trong khi vjust dùng để điều khiển căn lề dọc. Xem tài liệu của geom_text() để biết thêm.
Để minh họa điều gì xảy ra, bạn có thể tạo một data frame từ mọi tổ hợp của các nhân tố với hàm expand.grid():
hjustvjust <- expand.grid(hjust=c(0, 0.5, 1),
vjust=c(0, 0.5, 1),
angle=c(0, 45, 90),
text="Text"
)
Lưu ý rằng hjust và vjust chỉ nhận giá trị từ 0 đến 1.
0nghĩa là văn bản căn trái; Nói cách khác, toàn bộ văn bản thẳng hàng với lề trái. Đây thường là những gì bạn thấy khi làm việc với các trình soạn thảo văn bản như Microsoft Word.1nghĩa là văn bản căn phải: toàn bộ văn bản thẳng hàng với lề phải.
ggplot(), định nghĩa trục x và y lần lượt là hjust và vjust:
Cũng lưu ý cách các đối số hjust và vjust được thêm vào geom_text(), hàm chịu trách nhiệm thêm chú thích văn bản vào biểu đồ.
Trong biểu đồ trên, bạn thấy văn bản tại điểm (0,0) được căn trái, cả theo chiều ngang lẫn chiều dọc. Ngược lại, văn bản tại điểm (1,1) được căn phải theo cả hai hướng. Điểm (0.5,0.5) nằm chính giữa: không thực sự căn trái hay căn phải theo cả hai hướng.
Lưu ý rằng khi các đối số này được định nghĩa để thay đổi văn bản trục, căn lề ngang cho văn bản trục được xác định tương quan với toàn bộ biểu đồ, không phải với trục x!vjust để thay đổi văn bản trục sẽ ảnh hưởng thế nào đến cách hiển thị biểu đồ của bạn:
Để đọc cuộc thảo luận gốc xuất sắc, nơi mã trên được tham khảo, hãy nhấp vào đây.
Lời kết…
Đáng để xem qua bài viết này, liệt kê 10 mẹo để giúp đồ họa R của bạn trông đẹp nhất!
Ngoài ra, nếu bạn muốn biết thêm về trực quan hóa dữ liệu, bạn có thể cân nhắc khóa học tương tác trực quan hóa dữ liệu với ggvis của DataCamp, do Garrett Grolemund, tác giả của Hands on Programming with R và Data Science with R, giảng dạy.
Hoặc có thể bạn sẽ hứng thú với khóa học về báo cáo với R Markdown của chúng tôi!