2017-11-05 7 views
1

Ich versuche eine Flächenberechnung für ein Projekt in der Forstwirtschaft durchzuführen. Die Daten bestehen aus 1241 Übersichten mit zwei relevanten Variablen:ggplot2: Fläche pro Faktor barplot (geom_bar) - enthält fehlende Werte (geom_text)

MiWaReVe: 20 Klassen von Waldtypen, abgekürzt mit Zahlencodes, im Format "Faktor". area_ha: die Fläche eines Waldtyps in Hektar, im Format "num".

Hier ist meine minimale Datenmenge:

structure(list(Id = c(0L, 2L, 3L, 4L, 5L, 17L), MiWaReVe = structure(c(7L, 
7L, 14L, 17L, 17L, 17L), .Label = c("", "0", "1.1.", "2.1.", 
"2.2.1.", "2.2.2.", "2.3.1.", "2.3.2.", "3.1.1.", "3.1.2.", "3.2.1.", 
"3.2.2.", "3.2.3.", "4.1.", "4.2.", "5.1.", "5.2.", "6.", "7.", 
"8."), class = "factor"), area_ha = c(8.08759, 8.76723, 5.5033, 
1.22659, 4.31278, 8.23421), Owner = structure(c(2L, 2L, 2L, 2L, 
2L, 2L), .Label = c("Bundesforsten", "Kommunalwald", "Privatwald", 
"Staatswald"), class = "factor"), hint_cl = structure(c(3L, 3L, 
3L, 4L, 4L, 4L), .Label = c("A", "B", "C", "D", "E", "X"), class = "factor"), 
area_in_per = c(0.216871128099877, 0.23509587657276, 0.147572624140449, 
0.032891375182969, 0.115648476721321, 0.220802786950289)), .Names = c("Id", 
"MiWaReVe", "area_ha", "Owner", "hint_cl", "area_in_per"), row.names = c(NA, 
6L), class = "data.frame") 
Id MiWaReVe area_ha  Owner hint_cl area_in_per 
1 0 2.3.1. 8.08759 Kommunalwald  C 0.21687113 
2 2 2.3.1. 8.76723 Kommunalwald  C 0.23509588 
3 3  4.1. 5.50330 Kommunalwald  C 0.14757262 
4 4  5.2. 1.22659 Kommunalwald  D 0.03289138 
5 5  5.2. 4.31278 Kommunalwald  D 0.11564848 
6 17  5.2. 8.23421 Kommunalwald  D 0.22080279 

Mein Ziel ist es, die Gesamtfläche jedes der Waldtypen zu berechnen und eine BarPlot zeigt prozentuale Verteilung unter Verwendung von ggplot2 zu bauen. Ich tat dies mit dem folgenden Code:

library("ggplot2") 
library("scales") 


MiWaRe=read.table(file="2017_11_MiWaRe.csv", sep=";",dec="," , header=T) 

str(MiWaRe) 

# total area AOI 
area_total=sum(MiWaRe$area_ha) 


# area of each plot in % in a new column 
MiWaRe=cbind(MiWaRe, "area_in_per"=MiWaRe$area_ha/area_total*100) 
MiWaRe 
sum(MiWaRe$`area_in_per`) # check 


ggplot(data=MiWaRe, aes(x = factor(MiWaReVe), y=((area_in_per)/sum(area_in_per)))) +    
geom_bar(stat="identity") +   
scale_y_continuous(labels = percent) 

Mit diesem Code ich eine Basisversion des BarPlot bekommen, ich bin zu benötigen.

Jetzt möchte ich die genauen Prozentwerte über meine Balken angezeigt. Ich habe versucht, meinen Code mit dem fast zu einem folgenden:

ich verlängerte meinen Code mit:

ggplot(data=MiWaRe, aes(x = factor(MiWaReVe), y=((area_in_per)/sum(area_in_per)))) +    
geom_bar(stat="identity") +   
scale_y_continuous(labels = percent)+ 
geom_text(aes(label = scales::percent((area_in_per)/sum(area_in_per)), y= ..prop..), stat= "count", vjust = 25) 

aber it labels only one bar (es ist der Wald Art, die nur einmal vorkommt) und gibt mir die folgende: „Warnmeldung: 19 Zeilen mit fehlenden Werten (geom_text) entfernt. " Ich habe einige Nachforschungen zu dieser Warnmeldung angestellt, aber ich denke immer noch, dass das Problem tiefer ist als zu wenig Anzeigefläche.

Ich wurde auch versucht:

ggplot(data=MiWaRe, aes(x = factor(MiWaReVe), y=((area_in_per)/sum(area_in_per)))) +    
geom_bar(stat="identity") +   
scale_y_continuous(labels = percent)+ 
geom_text(aes(label = scales::percent(..prop..), 
      y= ..prop..), stat= "count", vjust = -1) 

aber es doesn't work either, of course.

Ich denke, Sie haben sicherlich bemerkt, dass ich immer noch sehr neu für R bin. In der Tat habe ich nur eine Woche lang das Programm selbst gelernt, aber ich konnte viele andere Probleme dank zu lösen Die Forenbeiträge hier. Ich bin jetzt seit einigen Stunden mit diesem Problem beschäftigt. Also, wenn mir jemand weiter helfen könnte wäre ich sehr dankbar und ich kann mich auf den langen Weg machen, R weiter zu beherrschen.

+3

ein [minimal reproduzierbaren Beispiel] Einschließlich (https://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example) in Frage erhöht Ihre Chancen auf eine Antwort. – jsb

+0

hat einen minimalen Datensatz für ein minimal reproduzierbares Beispiel hinzugefügt ... –

Antwort

0

Sie können das Paket aus dem Paket ggrepel verwenden, um diese Beschriftungen hinzuzufügen.

Zunächst erstelle ich eine area_pc Variable es leichter zu machen:

library(ggplot2) 
library(scales) 
library(ggrepel) 
library(dplyr) 


MiWaRe$area_pc <- MiWaRe$area_in_per/sum(MiWaRe$area_in_per) 

Dann erstelle ich die Datenbeschriftungen hinzuzufügen:

labels <- MiWaRe %>% 
    group_by(MiWaReVe) %>% 
    summarise(pc_label = sum(area_pc)) 

Dann fügen Sie sie einfach auf dem Grundstück Sie zuvor erstellt haben :

ggplot(data=MiWaRe, aes(x = factor(MiWaReVe), y = area_pc)) +    
    geom_bar(stat="identity") +   
    scale_y_continuous(labels = percent) + 
    geom_text_repel(data = labels, aes(x = factor(MiWaReVe), 
            y = pc_label, 
            label = scales::percent(pc_label))) 

Das Ergebnis sieht so aus:

enter image description here