boxplot() trong R: Cách thực hiện BoxVẽ đồ thị trong RStudio
⚡ Tóm tắt thông minh
BoxHàm `plot` trong R tóm tắt phân bố số liệu thông qua trung vị, tứ phân vị, râu và các giá trị ngoại lệ bằng cách sử dụng hàm `geom_boxplot()` từ thư viện `ggplot2`. Hướng dẫn này xây dựng biểu đồ hộp trên tập dữ liệu chất lượng không khí và thêm các lớp màu sắc, chấm, độ lệch, vết lõm và so sánh nhóm.
boxplot() trong R
boxplot() trong R giúp hình dung sự phân bố dữ liệu theo tứ phân vị và phát hiện sự hiện diện của các giá trị ngoại lai. Bạn có thể sử dụng đối tượng hình học geom_boxplot() từ thư viện ggplot2 để vẽ boxplot() trong R.
Chúng ta sẽ sử dụng bộ dữ liệu chất lượng không khí để giới thiệu hàm boxplot() trong R với ggplot. Bộ dữ liệu ghi lại các phép đo chất lượng không khí hàng ngày ở New York từ tháng 5 đến tháng 9 năm 1973 và chứa 153 quan sát. Chúng ta sẽ sử dụng các biến sau:
- Ozone: Biến số
- Gió: Biến số
- Tháng: Tháng 5 đến tháng 9. Biến số
Trước khi vẽ, điều đáng lưu ý là cần biết chính xác từng phần của hình hộp tượng trưng cho điều gì.
Làm thế nào để đọc một Box Biểu đồ: Tứ phân vị, khoảng tứ phân vị và các giá trị ngoại lệ
Mỗi phần tử trong biểu đồ hộp mã hóa một con số từ tóm tắt năm số. Biết được con số nào là con số nào sẽ biến biểu đồ từ công cụ trang trí thành công cụ phân tích.
- Bản lề dưới: Tứ phân vị thứ nhất, Q1. Hai mươi lăm phần trăm số quan sát nằm dưới mức này.
- Đường trung tuyến: Tứ phân vị thứ hai. Vị trí của nó bên trong hộp cho thấy độ lệch: một đường bị đẩy về phía dưới có nghĩa là dữ liệu bị lệch phải.
- Bản lề trên: Tứ phân vị thứ ba, Q3. Bảy mươi lăm phần trăm các quan sát nằm dưới mức này.
- Box Chiều cao: Khoảng tứ phân vị, IQR = Q3 – Q1, chứa một nửa dữ liệu ở giữa và là thước đo độ phân tán tiêu chuẩn và đáng tin cậy.
- Râu: Chúng mở rộng đến quan sát cực đoan nhất vẫn nằm trong phạm vi 1.5 lần khoảng tứ phân vị (IQR) của bản lề gần nhất. Chúng không phải là giá trị tối thiểu và tối đa.
- Những điểm cần lưu ý ngoài những điều nhỏ nhặt: Các quan sát được đánh dấu là ngoại lệ theo quy tắc IQR 1.5 đó.
Có hai lưu ý. Thứ nhất, "giá trị ngoại lệ" ở đây là một dấu hiệu thống kê, không phải là lỗi: trong một phân bố lệch như nồng độ ozone, các giá trị cao là điều được mong đợi và không nên bị xóa. Thứ hai, biểu đồ hộp che giấu hình dạng của phân bố, vì vậy hai nhóm có hộp giống hệt nhau có thể có dữ liệu cơ bản rất khác nhau. Việc thêm các điểm được làm nhiễu, như hình dưới đây, sẽ giúp tránh điều đó.
Box So sánh Plot, Histogram và Violin Plot trong R.
Cả ba biểu đồ đều mô tả sự phân bố số liệu, nhưng mỗi biểu đồ lại tiết lộ điều mà các biểu đồ khác che giấu.
| Tiêu chí | Box Âm mưu | Histogram | Lô đàn vĩ cầm |
|---|---|---|---|
| Chương trình | Trung vị, tứ phân vị, giá trị ngoại lệ | Tần số trong mỗi khoảng | Đường cong mật độ đầy đủ |
| Revnhiều đỉnh | Không | Có | Có |
| Đánh dấu các giá trị ngoại lệ | Vâng, rõ ràng là vậy | Chỉ về mặt hình ảnh | Không trực tiếp |
| So sánh nhiều nhóm | Xuất sắc | Lúng túng | tốt |
| Cần có lựa chọn điều chỉnh | Không | Vâng, số lượng thùng | Vâng, băng thông |
| Đối tượng ggplot2 | geom_boxplot() | geom_histogram() | geom_violin() |
Một giải pháp thỏa hiệp phổ biến là vẽ biểu đồ violin với một biểu đồ hộp hẹp bên trong, giúp giữ nguyên hình dạng mật độ và tóm tắt tứ phân vị trong cùng một biểu đồ. Xem thêm hướng dẫn về biểu đồ tần số Về khía cạnh phân loại trong phép so sánh.
Tạo Box Âm mưu
Trước khi bạn bắt đầu tạo boxplot() đầu tiên trong R, bạn cần thao tác dữ liệu như sau:
- Bước 1: Nhập dữ liệu
- Bước 2: Bỏ các biến không cần thiết
- Bước 3: Chuyển đổi Tháng thành một yếu tố có thứ tự
- Bước 4: Tạo một biến phân loại mới, chia mỗi tháng thành ba phần: Đầu tháng, Giữa tháng và Cuối tháng.
- Bước 5: Xóa các quan sát bị thiếu
Tất cả các bước này được thực hiện với dplyr và toán tử đường ống %>%.
library(dplyr) library(ggplot2) # Step 1 data_air <- airquality %>% #Step 2 select(-c(Solar.R, Temp)) %>% #Step 3 mutate(Month = factor(Month, order = TRUE, labels = c("May", "June", "July", "August", "September")), #Step 4 day_cat = factor(ifelse(Day < 10, "Begin", ifelse(Day < 20, "Middle", "End"))))
Một cách thực hành tốt là kiểm tra cấu trúc của dữ liệu bằng hàm lookup().
glimpse(data_air)
Đầu ra:
## Observations: 153 ## Variables: 5 ## $ Ozone <int> 41, 36, 12, 18, NA, 28, 23, 19, 8, NA, 7, 16, 11, 14, ... ## $ Wind <dbl> 7.4, 8.0, 12.6, 11.5, 14.3, 14.9, 8.6, 13.8, 20.1, 8.6... ## $ Month <ord> May, May, May, May, May, May, May, May, May, May, May,... ## $ Day <int> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,... ## $ day_cat <fctr> Begin, Begin, Begin, Begin, Begin, Begin, Begin, Begi...
Cả Ozone và Solar.R đều chứa các giá trị NA. Vì hàm geom_boxplot() sẽ âm thầm loại bỏ chúng và in ra cảnh báo, nên việc loại bỏ chúng một cách rõ ràng sẽ gọn gàng hơn.
# Step 5
data_air_nona <-data_air %>% na.omit()
Biểu đồ hộp cơ bản
Bây giờ hãy vẽ biểu đồ phân bố ozone theo tháng.
# Store the graph box_plot <- ggplot(data_air_nona, aes(x = Month, y = Ozone)) # Add the geometric object box plot box_plot + geom_boxplot()
Code Giải thích
- Lưu trữ biểu đồ để sử dụng tiếp
- box_plot: biểu đồ cơ bản được lưu trữ trong đối tượng box_plot, cho phép bạn thêm các lớp sau này mà không cần lặp lại toàn bộ lệnh gọi.
- Thêm đối tượng hình học
- Bạn truyền tập dữ liệu data_air_nona vào hộp lệnh ggplot.
- Bên trong đối số aes(), bạn thêm trục x và trục y.
- Dấu + có nghĩa là bạn muốn R tiếp tục đọc mã. Nó làm cho mã dễ đọc hơn bằng cách phá vỡ nó.
- Sử dụng geom_boxplot() để tạo biểu đồ hộp
Đầu ra:
Thay đổi cạnh của đồ thị
Bạn có thể lật cạnh của biểu đồ.
box_plot +
geom_boxplot()+
coord_flip()
Code Giải thích
- box_plot: Bạn sử dụng biểu đồ đã lưu trữ. Nó tránh việc phải viết lại tất cả các mã mỗi khi bạn thêm thông tin mới vào biểu đồ.
- geom_boxplot(): vẽ các hộp và râu
- coord_flip(): Lật cạnh của đồ thị
Đầu ra:
Thay đổi màu của ngoại lệ
Bạn có thể thay đổi màu sắc, hình dạng và kích thước của các ngoại lệ.
box_plot +
geom_boxplot(outlier.colour = "red",
outlier.shape = 2,
outlier.size = 3) +
theme_classic()
Code Giải thích
- outlier.colour=”red”: Kiểm soát màu của các ngoại lệ
- outlier.shape=2: Thay đổi hình dạng của ngoại lệ. 2 đề cập đến hình tam giác
- outlier.size=3: Thay đổi kích thước của tam giác. Số lớn hơn sẽ vẽ các điểm đánh dấu lớn hơn.
Đầu ra:
Thêm một thống kê tóm tắt
Bạn có thể chồng thêm một số liệu thống kê tóm tắt, chẳng hạn như giá trị trung bình của nhóm, mà bản thân biểu đồ hộp không hiển thị.
box_plot +
geom_boxplot() +
stat_summary(fun.y = mean,
geom = "point",
size = 3,
color = "steelblue") +
theme_classic()
Code Giải thích
- Hàm stat_summary() thêm một thống kê được tính toán vào trên biểu đồ hộp.
- Tham số `fun` kiểm soát số liệu thống kê nào được trả về. Ở đây là giá trị trung bình. Lưu ý rằng mã cũ hơn sử dụng `fun.y`, mà ggplot2 đã loại bỏ trong phiên bản 3.3.0.
- Lưu ý: Các số liệu thống kê khác có sẵn như tối thiểu và tối đa. Nhiều số liệu thống kê có thể được hiển thị trong cùng một biểu đồ
- geom=“point”: Vẽ giá trị trung bình bằng một điểm
- size=3: Kích thước của điểm
- color="steelblue": Màu sắc của các điểm
Đầu ra:
Box Vẽ đồ thị bằng dấu chấm
Tiếp theo, thêm một lớp biểu đồ chấm lên trên các ô. Mỗi chấm đại diện cho một quan sát duy nhất, giúp hiển thị kích thước mẫu đằng sau mỗi ô.
box_plot +
geom_boxplot() +
geom_dotplot(binaxis = 'y',
dotsize = 1,
stackdir = 'center') +
theme_classic()
Code Giải thích
- Hàm geom_dotplot() vẽ một chấm cho mỗi quan sát, được xếp chồng lên nhau trong mỗi ô.
- binaxis='y': Thay đổi vị trí của các dấu chấm dọc theo trục y. Theo mặc định, trục x
- dotsize=1: Kích thước của dấu chấm
- stackdir='center': Cách xếp chồng các dấu chấm: Bốn giá trị:
- “lên” (mặc định),
- "xuống"
- "trung tâm"
- “trung tâm”
Đầu ra:
Kiểm soát tính thẩm mỹ của Box Âm mưu
Thay đổi màu của hộp
Bạn có thể thay đổi màu sắc của nhóm.
ggplot(data_air_nona, aes(x = Month, y = Ozone, color = Month)) + geom_boxplot() + theme_classic()
Code Giải thích
- Màu sắc của các nhóm được điều khiển trong bản đồ aes().pingBạn có thể sử dụng `color=Month` để thay đổi màu sắc của biểu đồ hộp và râu theo từng tháng.
Đầu ra:
Box âm mưu với nhiều nhóm
Cũng có thể thêm nhiều nhóm. Bạn có thể hình dung sự khác biệt về chất lượng không khí theo ngày đo.
ggplot(data_air_nona, aes(Month, Ozone)) + geom_boxplot(aes(fill = day_cat)) + theme_classic()
Code Giải thích
- Bản đồ aes()ping Đối tượng hình học điều khiển các nhóm cần hiển thị (biến này phải là một yếu tố).
- aes(fill= day_cat) cho phép tạo ba hộp cho mỗi tháng trên trục x
Đầu ra:
Box Vẽ đồ thị với các chấm bị biến dạng
Một cách khác để thể hiện các quan sát riêng lẻ là sử dụng các điểm được làm nhiễu. Làm nhiễu thường là lựa chọn khi trục x phân loại khiến nhiều điểm rơi vào cùng một vị trí.
Phương pháp này tránh được sự chồng chéo.ping của dữ liệu rời rạc.
box_plot +
geom_boxplot() +
geom_jitter(shape = 15,
color = "steelblue",
position = position_jitter(width = 0.21)) +
theme_classic()
Code Giải thích
- Hàm geom_jitter() thêm một độ dịch chuyển ngẫu nhiên nhỏ vào mỗi điểm để tạo sự chồng lấp.ping Các giá trị trở nên rõ ràng.
- shape=15 thay đổi hình dạng của các điểm. 15 biểu diễn các hình vuông
- color=“steelblue”: Thay đổi màu của điểm
- position = position_jitter(width = 0.21): kiểm soát khoảng cách dịch chuyển ngang của các điểm, được đo bằng đơn vị trục x. Giá trị mặc định là 40% khoảng cách giữa các danh mục.
Đầu ra:
Bạn có thể thấy sự khác biệt giữa biểu đồ đầu tiên với phương pháp jitter và biểu đồ thứ hai với phương pháp điểm.
box_plot +
geom_boxplot() +
geom_point(shape = 5,
color = "steelblue") +
theme_classic()
Chữ khắc Box Âm mưu
Một tính năng thú vị của geom_boxplot() là hàm biểu đồ hộp có khía trong R. Biểu đồ khía thu hẹp hộp xung quanh trung vị. Mục đích chính của biểu đồ hộp có khía là so sánh ý nghĩa của trung vị giữa các nhóm. Có bằng chứng mạnh mẽ cho thấy hai nhóm có trung vị khác nhau khi các khía không chồng lên nhau. Một khía được tính như sau:
Ở đây, IQR là khoảng tứ phân vị và n là số lượng quan sát trong nhóm. Vùng khuyết trải rộng trên khoảng tin cậy 95% của trung vị.
box_plot +
geom_boxplot(notch = TRUE) +
theme_classic()
Code Giải thích
- geom_boxplot(notch = TRUE): vẽ biểu đồ hộp với các đường khía xung quanh đường trung vị
Đầu ra:
Cách thêm tiêu đề, nhãn và màu sắc tùy chỉnh vào Box Vẽ đồ thị trong R
Các biểu đồ ở trên sử dụng các thiết lập mặc định của ggplot2, lấy tên biến trực tiếp từ khung dữ liệu. Một biểu đồ có thể xuất bản cần có nhãn dễ đọc và bảng màu được lựa chọn kỹ lưỡng.
Tiêu đề và nhãn trục. Một lệnh gọi labs() sẽ thiết lập mọi phần tử văn bản:
box_plot +
geom_boxplot(fill = "coral", alpha = 0.7) +
labs(title = "Ozone concentration by month",
subtitle = "New York, May to September 1973",
x = "Month",
y = "Ozone (parts per billion)",
caption = "Source: airquality dataset") +
theme_classic()
Bạn có thể tự chọn màu sắc. Sử dụng scale_fill_manual() khi fill được ánh xạ bên trong aes(), và scale_colour_manual() khi colour là:
ggplot(data_air_nona, aes(x = Month, y = Ozone, fill = Month)) + geom_boxplot() + scale_fill_manual(values = c("#0e9cd1", "coral", "#7dc27d", "#c9a227", "grey60")) + theme_classic() + theme(legend.position = "none")
Phần chú thích đã được tắt ở đây vì trục x đã ghi tên từng tháng rồi, việc lặp lại sẽ lãng phí không gian.
Sắp xếp lại các hộp. Các cấp độ của yếu tố quyết định thứ tự trên trục. Vì Tháng được tạo ra như một yếu tố có thứ tự, nên nó đã được sắp xếp theo thứ tự thời gian. Đối với một yếu tố không có thứ tự, hãy sắp xếp theo giá trị trung vị:
ggplot(data_air_nona, aes(x = reorder(Month, Ozone, FUN = median), y = Ozone)) + geom_boxplot() + theme_classic()
Đang lưu biểu đồ. Hàm ggsave() ghi đồ thị cuối cùng vào ổ đĩa với độ phân giải do bạn kiểm soát:
ggsave("ozone_boxplot.png", width = 8, height = 5, dpi = 300)
Box Vẽ đồ thị trong R: Code Tài liệu tham khảo
Bảng dưới đây liệt kê lệnh gọi ggplot2 cho từng biến thể biểu đồ hộp đã đề cập ở trên:
| Mục tiêu | Code |
|---|---|
| Biểu đồ hộp cơ bản |
ggplot(df, aes(x = x1, y = y)) + geom_boxplot() |
| Lật ngược hướng |
ggplot(df, aes(x = x1, y = y)) + geom_boxplot() + coord_flip() |
| Biểu đồ hộp có khía |
ggplot(df, aes(x = x1, y = y)) + geom_boxplot(notch = TRUE) |
| Box vẽ đồ thị với các dấu chấm lộn xộn |
ggplot(df, aes(x = x1, y = y)) + geom_boxplot() + geom_jitter(position = position_jitter(0.21)) |
| Tô màu theo nhóm |
ggplot(df, aes(x = x1, y = y, color = x1)) + geom_boxplot() |
| Nhiều nhóm cho mỗi danh mục |
ggplot(df, aes(x = x1, y = y)) + geom_boxplot(aes(fill = x2)) |
| Cộng giá trị trung bình của nhóm |
ggplot(df, aes(x = x1, y = y)) + geom_boxplot() + stat_summary(fun = mean, geom = "point") |
Cũng kiểm tra:- Hướng dẫn R cho người mới bắt đầu: Học ngôn ngữ lập trình R












