我试图为林业项目进行一些区域计算。 数据包括1241个具有两个相关变量的obervations:
MiWaReVe:"因子"中的20种森林类型,缩写为数字代码。格式。 area_ha:以公顷为单位的森林类型区域,在" num"格式。
这是我的最小数据集:
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
我的目标是计算每种森林类型的总面积,并使用ggplot2构建显示百分比分布的条形图。我使用以下代码完成了此操作:
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)
使用此代码,我得到了一个基本版本的条形图,我需要。
现在我想要在条形图上显示的确切百分比值。我尝试使用以下代码扩展我的代码:
我用以下代码扩展了我的代码:
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)
但it labels only one bar (它只是一次出现的森林类型)并给我以下内容:"警告消息: 删除了包含缺失值的19行(geom_text)。" 我已经对这个警告信息进行了一些研究,但我仍然认为问题比显示空间太小更深。
我也在尝试:
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)
但doesn't work either, of course。
我觉得你肯定注意到我对R还是很陌生。事实上,我自己只学了一个星期,但我已经能够通过这里的论坛帖子解决许多其他问题。我现在已经坚持这个问题几个小时了。 所以,如果有人能够进一步帮助我,我将非常感激,并且我可以在漫长的道路上进一步掌握R。
答案 0 :(得分:0)
您可以使用geom_text_repel()
包中的ggrepel
添加这些标签。
首先,我创建一个area_pc
变量以使其更容易:
library(ggplot2)
library(scales)
library(ggrepel)
library(dplyr)
MiWaRe$area_pc <- MiWaRe$area_in_per / sum(MiWaRe$area_in_per)
然后我创建数据以添加标签:
labels <- MiWaRe %>%
group_by(MiWaReVe) %>%
summarise(pc_label = sum(area_pc))
然后只需将其添加到您之前创建的图中:
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)))
结果如下: