Monday, 19 September 2016

Ở các bài trước mình có tập tành vẽ biểu đồ tương quan với nhãn bằng việc kết hợp 2 gói (package) ggplot2ggthemes. Trong phạm vi bài này, mình vẫn sử dụng 2 gói trên và có kết hợp thêm gói ggrepel để khắc phục một vài điểm nhỏ để chúng ta có được một đồ tương đối hoàn chỉnh.

Trong ví dụ mà mình vẽ biểu đồ là dữ liệu về 2 chỉ số G (%) và IV (%) để xác định tổ thành tầng cây cao, thông qua công thức của Daniel Marmillod, cụ thể:
Theo Thái Văn Trừng (1983) thì những loài cây nào có chỉ số IV (%) ≥ 5% mới thực sự có ý nghĩa về mặt sinh thái trong quần xã thực vật rừng. Để thể hiện chi tiết giá trị (độ) quan trọng IV (%) của các loài tham gia trong công thức tổ thành trên biểu đồ thì sẽ xuất hiện trường hợp có một vài loài, nhiều loài có giá trị IV (%) gần giống nhau, thậm chí có thể bằng nhau. Vì vậy, khi thể hiện trên biểu đồ (điểm, nhãn...) sẽ gần nhau, hoặc trùng nhau, như vậy trông sẽ rất khó coi và không khoa học. Thực ra, những gì mình nói ra trên đây sẽ là khó hiểu, bởi rất ít trường hợp thể hiện biểu đồ như mình và để hình dung dễ hơn mình sẽ thể hiện qua các biểu đồ để mọi người dễ hiểu.

Trong gói mới (ggrepel) mà mình kết hợp với ggplot2 và ggthemes có layer rất hữu ích đó là geom_text_repel (x, y, label...) có thể khắc phục được nhược điểm mà mình có đề cập bên trên. Chúng mình cùng bắt đầu qua ví dụ dưới đây nhé.

Trước tiên phải gọi các packages cần sử dụng:

> library(ggplot2)
> library(ggthemes)

Khi mới vẽ các điểm (dot) codes như sau:

> x1=ggplot(data=xoanmoc11, aes(x=IV, y=G))+ geom_point()+ theme_bw()+ theme_classic()+ xlab("IV, %")+ ylab("G, %")+ geom_rangeframe()+ theme_tufte()+ scale_x_continuous(breaks=extended_range_breaks()(xoanmoc11$IV))+ scale_y_continuous(breaks=extended_range_breaks()(xoanmoc11$G))+ ggtitle("Figure 1")
Kết quả ở hình 1 (Figure 1) mới thể hiện phân bố các điểm với trục hoành là độ quan trọng (IV, %) và trục tung là tiết diện ngang (G, %) của các loài tham gia trong công thức tổ thành của tầng cây cao. 
Bây giờ để thể hiện tên các loài (nhãn) trên biểu đồ, ta thêm layer: geom_text (aes(label=...) kết quả ở hình 2 (Figure 2).

> x2=ggplot(data=xoanmoc11, aes(x=IV, y=G))+ geom_point()+ theme_bw()+ theme_classic()+ xlab("IV, %")+ ylab("G, %")+ geom_rangeframe()+ theme_tufte()+ scale_x_continuous(breaks=extended_range_breaks()(xoanmoc11$IV))+ scale_y_continuous(breaks=extended_range_breaks()(xoanmoc11$G))+ ggtitle("Figure 2") + geom_text(aes(label=(loaicay)))


Qua hình 2 (Figure 2) ta có thể nhận thấy một điều nhiều tên loài cây gần sát nhau, trùng nhau tạo nên một biểu đồ chưa thực sự khoa học, thiếu mỹ quan như bên trên mà mình có đề cập. Để khắc phục điều này, trong phạm vi bài này mình kết hợp thêm layer: geom_text_repel (aes(x, y, label=...)) trong gói ggrepel để tạo ra biểu đồ khoa học hơn, đẹp hơn và có thể tạm gọi là “tương đối hoàn chỉnh”. Cụ thể dưới đây.

> x1=ggplot(data=xoanmoc11, aes(x=IV, y=G))+ geom_point()+ theme_bw()+ theme_classic()+ xlab("IV, %")+ ylab("G, %")+ geom_rangeframe()+ theme_tufte()+ scale_x_continuous(breaks=extended_range_breaks()(xoanmoc11$IV))+ scale_y_continuous(breaks=extended_range_breaks()(xoanmoc11$G))+ ggtitle("Figure 3") 
> x12=x1+geom_text_repel(aes(IV,G, label=(loaicay)))


Qua hình 3 (Figure 3) các bạn có thể nhận thấy các loài cây có chỉ số IV, G gần bằng nhau không chồng lấn lên nhau nữa, mà vẫn biết giá trị IV, G của từng loài. Bạn có thể so sánh giữa hình 2 và hình 3 để thấy sự khác biệt nhé.

Dưới đây mình vẽ thêm một vài hình để các bạn thấy sự khác biệt sau khi khắc phục điểm hạn chế bên trên mà mình có đề cập bằng layer: geom_text_repel() trong gói ggrepel.


> x2=ggplot(data=xoanmoc2, aes(x=IV, y=G))+ geom_point()+ theme_bw()+ theme_classic()+ xlab("IV, %")+ ylab("G, %")+ geom_rangeframe()+ theme_tufte()+ scale_x_continuous(breaks=extended_range_breaks()(xoanmoc2$IV))+ scale_y_continuous(breaks=extended_range_breaks()(xoanmoc2$G))+ ggtitle("Figure 4")+ geom_text(aes(label=loai))


Và thay layer: geom_text () trong ggplot 2 bằng layer: geom_text_repel() trong ggrepel.

> x22=x2+geom_text_repel(aes(IV,G, label=(loai)))


Khi vẽ biểu đồ trên với nhãn sẽ có một trường hợp nữa xuất hiện, đó là một vài loài cây có cùng một giá trị và điều đó sẽ được thể hiện ở hình dưới đây sau khi sử dụng layer: geom_text_repel().

> xts=ggplot(data=xoants1, aes(x=ni, y=Ki))+ geom_point()+ theme_bw()+ theme_classic()+ xlab("Ni")+ ylab("Ki")+ geom_rangeframe()+ theme_tufte()+ scale_x_continuous(breaks=extended_range_breaks()(xoants1$ni))+ scale_y_continuous(breaks=extended_range_breaks()(xoants1$Ki))+ ggtitle("Figure 6")+geom_text(aes(label=loai))


Các bạn sẽ thấy ở hình 6 (Figure 6) có nhiều điểm các loài cây cùng một giá trị, khi thể hiện tên (nhãn) các loài sẽ chồng lên nhau. Và khắc phục điều đó, ta có thể làm như sau:

> xts1=xts+geom_text_repel(aes(label=loai))


Trên đây mình có giới thiệu tới các bạn việc kết hợp 3 gói (ggplot2, ggthemes và ggrepel) khác nhau trong R để vẽ một biểu đồ khoa học, đẹp và tương đối hoàn chỉnh. Các bạn có thể thực hành để thấy sự khác biệt nhé.

0 nhận xét:

Post a Comment

Powered by Blogger.

Contact Form

Name

Email *

Message *

Pages - Menu

Popular

Total Pageviews

Popular Posts

Recent Posts

Text Widget