Ở
|
các bài trước mình có tập tành vẽ biểu đồ hộp
kết hợp giữ package ggplot2 với package ggthemes. Trong phạm vi bài này, mình vẫn
kết hợp 2 gói trên để vẽ biểu đồ, tuy nhiên, mình có thêm các layer như (coor_flip(), theme(legend.positon
=“...”, notch = T, notchwidth = ..., outlier.colour = “...”, outlier.size = ...) để tạo
nên những biểu đồ đẹp và sinh động hơn có thể. Bạn nào quan tâm, cùng mình tập
tành vẽ biểu đồ hộp (boxplot) với sự kết hợp 2 gói ggplot2 và ggthemes, trong
đó có thêm một số layer mà mình có đề cập như trên.
> names(TrieuPhong)
[1] "Local" "Age" "CTTN"
[4]
"stump_diameter"
"tree_height"
"canopy_diameter"
[7]
"main_trunk"
"bough_50_cm"
"phan_than"
[10] "song_chet"
"stump_diameter_growth"
"tree_height_growth"
[13] "canopy_diameter_growth"
"litter_fall"
Nói qua
chút về data.frame (). Dữ liệu là một số chỉ tiêu sinh trưởng của cây Keo lá liềm
(Acacia crassicarpa) trồng trên vùng
cát ven biển huyện Triệu Phong, tỉnh Quảng Trị. Thí nghiệm gồm 4 công thức (ĐC,
CT 1, CT2 và CT 3), ở 2 thời kỳ khác nhau (tuổi 1,2 và tuổi 2,3). Các chỉ tiêu
sinh trưởng như: stump diameter, tree height, canopy diameter, number longer
boughs 50 cm, number main trunks, leaf litterfall...
Cùng bắt đầu
nhé:
> library(ggplot2)
> library(ggthemes)
# Mình chỉ lấy ví dụ về chỉ tiêu leaf
litterfall ở 2 độ tuổi khác nhau, các chỉ tiêu khác cũng tương tự.
Biểu đồ hộp
(boxplot) như các bài trước, không có các layer (coor_flip(),
theme(legend.positon =“...”, notch = T, notchwidth = ..., outlier.colour = “...”, outlier.size = ...) sẽ cho
kết quả như sau (Figure 1).
# code như sau:
> Age2.3tp61=ggplot(data=Age2.3tp, aes(Age2.3tp$CTTN, y=litter_fall))+ geom_boxplot(aes(fill=CTTN))+ theme_bw()+ theme_classic()+ xlab("CTTN")+ ylab("Leaf litter fall, kg/tree")+ggtitle("Leaf litterfall of A. crassicarpa 2.3 years old in Trieu Phong")+ geom_rangeframe()+ theme_tufte()+ scale_y_continuous(breaks=extended_range_breaks()(Age2.3tp$litter_fall))
> Age2.3tp61
# Với code
như trên, thêm layer: coord_flip(). Kết quả
Figure 2.
> Age2.3tp62=ggplot(data=Age2.3tp, aes(Age2.3tp$CTTN, y=litter_fall))+ geom_boxplot(aes(fill=CTTN))+ theme_bw()+ theme_classic()+ xlab("CTTN")+ ylab("Leaf litter fall, kg/tree")+ggtitle("Figure 1. Leaf litterfall of A. crassicarpa 2.3 years old in Trieu Phong")+ geom_rangeframe()+ theme_tufte()+ scale_y_continuous(breaks=extended_range_breaks()(Age2.3tp$litter_fall))+ coord_flip()
> Age2.3tp62
Kết quả
hình 2 có đôi chút khác so với hình 1. Hình 2 các hình hộp quay ngang thay vì đứng
dọc như hình 1. Lớp coord_flip() có công dụng
để làm điều đó.
# Với code
như trên, thêm layer: coord_flip() + theme(legend.position = “top”. Kết quả Figure 3.
> Age2.3tp63=ggplot(data=Age2.3tp, aes(Age2.3tp$CTTN, y=litter_fall))+ geom_boxplot(aes(fill=CTTN))+ theme_bw()+ theme_classic()+ xlab("CTTN")+ ylab("Leaf litter fall, kg/tree")+ggtitle("Figure 3. Leaf litterfall of A. crassicarpa 2.3 years old in Trieu Phong")+ geom_rangeframe()+ theme_tufte()+ scale_y_continuous(breaks=extended_range_breaks()(Age2.3tp$litter_fall))+ coord_flip()+ theme(legend.position="top")
> Age2.3tp63
Kết quả
hình 3 có một điểm khác so với hình 2, đó là ký hiệu công thức thí nghiệm ở
trên cùng “top” thay vì bên phải.
# Với code
như trên, thêm layer: theme(legend.position =
“top”. Ở layer: geom_boxplot() ta thêm notch
= T, notchwidth = 0.5. Kết quả như sau:
> Age2.3tp64=ggplot(data=Age2.3tp, aes(Age2.3tp$CTTN, y=litter_fall))+ geom_boxplot(aes(fill=CTTN), notch=T, notchwidth=0.5)+ theme_bw()+ theme_classic()+ xlab("CTTN")+ ylab("Leaf litter fall, kg/tree")+ggtitle("Figure 4. Leaf litterfall of A. crassicarpa 2.3 years old in Trieu Phong")+ geom_rangeframe()+ theme_tufte()+ scale_y_continuous(breaks=extended_range_breaks()(Age2.3tp$litter_fall))+ theme(legend.position="top")
> Age2.3tp64
Kết quả
hình 4 cho thấy, hình hộp ở 4 công thức thí nghiệm có tạo ra cái “eo” nhìn sinh
động hơn so với để nguyên cả hộp. Lệnh notch =T,
nochwidth = 0.5 có tác dụng cho việc đó. Tuy nhiên, thay vì giá trị 0.5
có thể thay bằng các giá trị khác từ 0.1 - 1.0 hãy cùng trải nghiệm để thấy sự
khác biệt dù là nhỏ nhất.
# Tương tự,
ở layer: geom_boxplot() ta thêm notch = T,
notchwidth = 0.5 + outlier.colour="blue",
outlier.size=3. Kết quả như sau:
> Age2.3tp65=ggplot(data=Age2.3tp, aes(Age2.3tp$CTTN, y=litter_fall))+ geom_boxplot(aes(fill=CTTN), notch=T, notchwidth=0.5, outlier.colour="blue", outlier.size=3)+ theme_bw()+ theme_classic()+ xlab("CTTN")+ ylab("Leaf litter fall, kg/tree")+ggtitle("Figure 5. Leaf litterfall of A. crassicarpa 2.3 years old in Trieu Phong")+ geom_rangeframe()+ theme_tufte()+ scale_y_continuous(breaks=extended_range_breaks()(Age2.3tp$litter_fall))+ theme(legend.position="top")+ coord_flip()
> Age2.3tp65
Kết quả
hình 5 không có sự khác biệt mấy, nếu để ý ta thấy chỉ thay đổi các chấm màu xanh (blue) thay vì màu đen ở các hình trên. Đó là outlier. Có thể thay đổi các màu khác,
cũng như size khác. Hãy thử nghiệm để thấy sự khác biệt. Bây giờ mình thay "blue" thành "red" và size = 3 thành size = 2, để ý sẽ thấy sự khác biệt nho nhỏ này.
> Age2.3tp66=ggplot(data=Age2.3tp, aes(Age2.3tp$CTTN, y=litter_fall))+ geom_boxplot(aes(fill=CTTN), notch=T, notchwidth=0.5,outlier.colour="red", outlier.size=2)+ theme_bw()+ theme_classic()+ xlab("CTTN")+ ylab("Leaf litter fall, kg/tree")+ggtitle("Figure 6. Leaf litterfall of A. crassicarpa 2.3 years old in Trieu Phong")+ geom_rangeframe()+ theme_tufte()+ scale_y_continuous(breaks=extended_range_breaks()(Age2.3tp$litter_fall))+ theme(legend.position="top")+ coord_flip()
> Age2.3tp66
Trên đây
là một số code nho nhỏ, không có gì to tác cả. Tuy nhiên, để tạo ấn tượng ban đầu
trên mỗi biểu đồ thì đó có thể coi là điểm nhấn của biểu đồ. Hãy cùng trải
nghiệm để thấy sự khác biệt dù là nhỏ nhất.