ggplot2:每个因子barplot的面积(geom_bar) - 包含缺失值(geom_text)

时间:2017-11-05 22:43:42

标签: r ggplot2 geom-bar geom-text

我试图为林业项目进行一些区域计算。 数据包括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。

1 个答案:

答案 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)))  

结果如下:

enter image description here