Thursday, 30 March 2017

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 để các bạn thấy sự khác biệt.

Nói qua một chút về phân bố số cây theo cỡ đường kính: Cỡ kính bao gồm: 10-15, 15-20, 20-25, 25-30, 30-35, 35-40, 40-45, 50-55, 55-60, và trên 60 (thay vì viết “> 60” trong excel, các bạn phải viết “Tren 60”, bởi, yêu cầu nghiêm ngặt về “văn phạm” trong R).

Trường hợp, muốn gộp (group) các trạng thái rừng trên cùng một cột (histogram) theo từng cỡ kính các bạn có thể tiến hành như sau:

> r=ggplot(data=LRTX, aes(x=Co_kinh, y=N, group=Location, fill=Location))+ geom_bar(stat="identity")
Bạn có thể nhìn thấy ở hình trên, như mình có nói, cỡ kính > 60cm lại nằm ở đầu thang giá trị cỡ kính (trục hoành) thay vì ở cuối. Bởi, lý dó, dấu “> 60”. Để theo thứ tự, bạn nên thay dấu “>” bằng từ “Tren”. Và, kết quả:
>  r=ggplot(data=LRTX, aes(x=Co_kinh, y=N, group=Location, fill=Location))+ geom_bar(stat="identity")
Để tách từng trạng thái rừng cho từng cột thay vì cộng dồn cùng cỡ kính trên cùng một cột, các bạn có thể làm như sau:
> p=ggplot(data=LRTX,aes( x=Co_kinh, y=N, fill=Location))+ geom_bar(position="dodge", stat="identity")+ theme_bw()+theme_classic()
> p1=p+ geom_rangeframe()+theme_tufte()+ scale_y_continuous(breaks=extended_range_breaks()(LRTX$N))+ xlab("Cỡ kính, cm")+ ylab("Số cây, cây/ha")
Kết quả hình trên là tương đối đẹp. Tuy nhiên, để thể hiện đường phân bố (line) cho từng trạng thái theo các cỡ kính, các bạn có thể làm như sau:
> p2=p1+geom_line(position=position, aes(group=Location, color=Location))
Để so sánh với hình vẽ trong excel thông thường, các bạn đưa ra lời nhận xét nhé:
Trên đây mình có bắt chước để vẽ biểu đồ phân bố số cây theo cỡ đường kính của một số trạng thái rừng nghiên cứu. Các bạn có thể coppy codes và thay nguồn đầu vào là data=LRTX, các biến “Location, Co_kinh, N” cũng như thêm các layer để có được các hình, biểu đồ như ý muốn.

Tuesday, 28 March 2017

Trong cái note này, mình đề cập một chút đến “văn phạm” trong R mà đôi khi ngồi xử lý dữ liệu sẽ mất thời gian nếu chúng ta không chú ý. “Văn phạm” chung của R là một lệnh (command) hay function (hàm). Các lệnh phải tuân thủ “nghiêm ngặt” theo “văn phạm” và ngôn ngữ của R [1]. Đơn cử, R phân biệt lệnh viết chữ hoa hay chữ thường “L” và “l”, hay thiếu dấu () R sẽ không chạy vào báo dấu (+) thay vì dấu (>)... Trong phạm vi bài viết, mình đề cập đến dấu chấm (.) và dấu phẩy (,) trong nhập dữ liệu.

Thay lời giải thích, mình đi thẳng vào dữ liệu để vẽ biểu đồ đường (line) trong ví dụ dưới đây.

Trường hợp, sử dụng dấu phẩy để phân biệt đơn vị hàng nghìn hay đơn vị 1/1000 khi nhập dữ liệu trong excel.
> fix(KT11)
Giá trị diện tích (S) của các loại đất, loại rừng được sử dụng dấu phẩy (,) để phân biệt đơn vị hàng nghìn. Từ dữ liệu này, chúng ta tiến hành vẽ biểu đồ với lệnh như dưới đây:
> kt=ggplot(data=KT11,aes(x=Year, y=S, group=as.factor(Location), color=Location))+ geom_line()+ geom_point()+ xlab("Nam")+ ylab("Din tích, ha")
Đường biểu diễn diện tích rừng trồng (RT- màu xanh lá cây) thể hiện giá trị bất thường (đường zic zắc) và thang giá trị của trục tung (diện tích) cũng sắp xếp không theo quy luật. Nghĩa là, trong dữ liệu R phân biệt dấu phẩy (,) và không dấu () trong chuỗi giá trị của dữ liệu.
Để khắc phục được vấn đề này, chúng ta quay lại số liệu gốc bỏ tích dấu phẩy (,) để phân biệt hàng nghìn và đơn vị 1/1000, nghĩa là, không dùng dấu phẩy (,) trong một số liệu. Kết quả như sau:
> fix(KT1)
Từ dữ liệu trên, chúng ta tiến hành các lệnh tương tự như trên (trường hợp trên). Lệnh như sau:
> kt=ggplot(data=KT1,aes(x=Year, y=S, group=as.factor(Location), color=Location))+ geom_line()+ geom_point()+ xlab("Nam")+ ylab("Din tích, ha")
Kết quả cho thấy, số liệu diễn biến diện tích các loại đất loại rừng phản ảnh đúng thực tế của dữ liệu. Bạn có thể đối chiếu đường (line) của rừng trồng (RT) mà xanh lá cây của hình này với trường hợp trên để thấy sự khác biệt.
Đến đây, chúng ta có thể sử dụng các layer trong package “ggthemes” để hoàn thiện biểu đồ tương đối đẹp và khoa học hơn.
> kt1=kt+ theme_bw()+theme_classic()+ geom_rangeframe()+theme_tufte()+scale_x_continuous(breaks = c(2000,2005,2010,2014))+ scale_y_continuous(breaks = extended_range_breaks()(KT1$S))
Hoặc các bạn có thể thay các ký hiệu các điểm (dot) cho mỗi đối tượng để dễ nhận biết:
> kt=ggplot(data=KT1,aes(x=Year, y=S, group=as.factor(Location), color=Location))+ geom_line()+ xlab("Nam")+ ylab("Din tích, ha")+ geom_point(aes(shape=Location, color=Location, size=Location)) 
> kt1=kt+ theme_bw()+theme_classic()+ geom_rangeframe()+theme_tufte()+scale_x_continuous(breaks = c(2000,2005,2010,2014))+ scale_y_continuous(breaks = extended_range_breaks()(KT1$S))
Trên đây mình có đề cập một chút (chi tiết nhỏ) liên quan đến “văn phạm” trong R, nếu không tuân thủ nghiêm ngặt các “văn phạm” và ngôn ngữ trong R thì chúng ta sẽ mất nhiều thì giờ để xử lý. Trong phạm vi bài viết, mình mới đưa ra 01 phương án, tức lại quay lại số liệu không để khắc phục, mà chưa có cách khác hay hơn (dùng một lệnh kèm trong quá trình vẽ biểu đồ, đỡ mất thời gian hơn). Tuy nhiên, mình chưa biết cách khắc phục, bạn nào biết cách khắc phục (không quay lại sửa số liệu gốc) bày giúp nhé, để mọi người cùng biết. Trân trọng!

=================
[1] Nguyễn Văn Tuấn (2014). Phân tích dữ liệu với R. Nxb Tổng hợp TP HCM, 518 trang (tr12).
Powered by Blogger.

Contact Form

Name

Email *

Message *

Pages - Menu

Popular

Total Pageviews

Popular Posts

Recent Posts

Text Widget