Wednesday, 21 September 2016

 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.

Related Posts:

  • Phân tích dữ liệu với R - Hỏi và Đáp Sau một thời gian vắng bóng do có chút bận rộn công việc cũng như công việc cá nhân, hôm nay nhân dịp năm mới gọi là lấy lại chút động lực để lại được theo đuổi cái đam mê cỏn con - ấy là bắt chước, tập tành, và ứng dụng nhữ… Read More
  • Biểu đồ sai số chuẩn (error bars) Trong bài trước, mình có tập tành chút với biểu đồ thanh với sai số chuẩn (error bar plot). Ở biểu đồ này, cho chúng ta cái nhìn trực quan về các thông tin: giá trị trung bình (mean) và sai số chuẩn (sd). Trong phạm vi cái … Read More
  • Giới thiệu sách hay về Nghiên cứu khoa học Trong cái note này mình xin mạn phép tác giả cuốn sách (GS Nguyễn Văn Tuấn - UNSW Sydney) và Nxb Tổng hợp TP HCM xin được giới thiệu tới bạn đọc cuốn sách hay về nghiên cứu khoa học chung, với tựa đề: “Cẩm nang Nghiên cứu … Read More
  • Subset dữ liệu với R T rong quá trình xử lý, phân tích số liệu vì một lý do nào đó, chúng ta muốn phân tích riêng cho từng đối tượng, địa điểm, độ tuổi hay từng công thức thí nghiệm tùy theo mục đích nghiên cứu. Lệnh subset trong R… Read More
  • Biểu đồ phân bố số cây theo cỡ kính (N-D) trong R Trong cái note này, mình chia sẻ cách vẽ biểu đồ histogram về chỉ tiêu phân bố số cây theo cỡ đường kính (N-D) của một số trạng thái rừng tự nhiên bằng R. Qua đây mình cũng đưa ra biểu đồ mà thông thường hay vẽ bằng excel đ… Read More

0 nhận xét:

Post a Comment

Powered by Blogger.

Contact Form

Name

Email *

Message *

Pages - Menu

Popular

Total Pageviews

33195

Popular Posts

Recent Posts

Text Widget