我正在try 将总数添加到堆叠条形图中,在该条形图中我描述了比例,其中x和y变量都是多个响应变量.尽管收到了警告消息,我还是设法对总数进行了计算,但当我试图将总数添加到比例条形图中时,它完全搞砸了.

这是我的DF hnvf3的摘录:

structure(list(HNV_grasslands = c(1L, 0L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L), HNV_arable = c(1L, 1L, 1L, 0L, 0L, 1L, 1L, 1L, 
1L, 1L, 1L), HNV_permanent_crop = c(1L, 1L, 1L, 0L, 0L, 1L, 1L, 
1L, 1L, 1L, 1L), HNV_mosaic = c(1L, 0L, 1L, 0L, 0L, 0L, 1L, 1L, 
1L, 0L, 1L), Animal_vegetal = c("", "Both", "Both", "Both", "", 
"Vegetal species", "Vegetal species", "", "Both", "Animal species", 
"Both")), row.names = 10:20, class = "data.frame")

这是我用来在Counts版本中添加总数的代码,尽管收到了警告:

在统计转换过程中删除了以下美学:fill当ggplot无法推断数据中正确的分组 struct 时,可能会发生这种情况.您是否忘记指定group美学或将数值变量转换为因子?

我把总数放在最上面.

hnvf4 <- hnvf3 %>%
  pivot_longer(
    cols = starts_with("HNV"),
    names_to = c("HNV"),
    names_prefix = "HNV_",
    values_to = "value1") |>
    filter(value1 == 1 & Animal_vegetal !="") |>
  select(-value1) # pone esto para que hnvf2 no sea todo "1" en todas las filas, sino el valor de provisioning, etc
glimpse(hnvf4)

hnvf4 |>
  ggplot(aes(x = HNV,fill = factor(Animal_vegetal, levels=c("Animal species", "Vegetal species", "Both")))) +
  geom_bar()+
  geom_text(stat ="count",aes(label=after_stat(count), group= HNV, vjust= -1))+
    scale_fill_manual(values = c("#FDCDAC", "#B3E2CD","#CBD5E8"))+
  theme(axis.text.x = element_text(angle=90, vjust = 0.5, hjust=1), 
        axis.ticks.x = element_blank())+
  theme(axis.line.y = element_line(linewidth = 0.5, colour = "black"),
        axis.ticks.length.y.left = unit(.25, "cm"))+
  theme(panel.background = element_rect(fill=NA))+
  scale_x_discrete(labels=c('arable land', 'grasslands', 'mosaic landscape', 
                            'permanent croplands')) +
  labs(x= "HNV farmland type", y="Number of studies", fill= "")+
  #geom_text(data=stacked, aes(label=nsum, variable),size=2, vjust= 1)+
  theme(axis.title.y = element_text(margin=margin(r= 15)))+
  scale_y_continuous(limits= c(0,100), breaks=c(0,25,50,75, 100),expand = c(0,0)) +
  theme(legend.position = c(.99, .95),
        legend.justification = c("right", "top"))

这是对比例不起作用的编码:

hnvf4%>%
  ggplot(aes(x = HNV,fill = factor(Animal_vegetal,levels=c("Animal species", "Vegetal species", "Both")))) +
  geom_bar(position="fill")+
  #geom_text(stat ="count",aes(label=after_stat(count), group= HNV, vjust= -1))+
  scale_fill_manual(values = c("#FDCDAC", "#B3E2CD","#CBD5E8"))+
  theme(axis.text.x = element_text(angle=90, vjust = 0.5, hjust=1), 
        axis.ticks.x = element_blank())+
  theme(axis.line.y = element_line(linewidth = 0.5, colour = "black"),
        axis.ticks.length.y.left = unit(.25, "cm"))+
  theme(panel.background = element_rect(fill=NA))+
  scale_x_discrete(labels=c('arable land', 'grasslands', 'mosaic landscape', 
                            'permanent croplands')) +
  labs(x= "HNV farmland type", y="Proportion of studies", fill= "")+
  #geom_text(data=stacked, aes(label=nsum, variable),size=2, vjust= 1)+
  theme(axis.title.y = element_text(margin=margin(r= 15)))+
  # para que no haya espacio extra y que el eje y salga de 0
  scale_y_continuous(expand = c(0,0))

我还判断了Stackflow中的以下条目:question1question2question3text,但我发现很难为geom_text()创建新的数据框,因为我没有显示变量计数的变量.我try 修改我的数据并 for each 变量创建一个带有计数的新df,但仍然不起作用.任何帮助都将不胜感激.

推荐答案

在绘制图形时,您try 过的创建数据的数字版本的方法是最简单的.我已经提供了一个tidyverse的方法来计算您的组的总和.

您需要为比例图上的文本标签设置position = "fill".我将geom_text()替换为stat_summary(),并将position = "fill"添加到比例图中,以便正确显示标签和条形图.

请注意,我找不到使用geom_text()stat_summary()(如果是scale_y_continuous(expand = c(0,0)))在y轴之外绘制文本的方法.所以我求助于coord_cartesian(clip = 'off')把你的标签放在吧台上.如果要使用scale_y_continuous(expand = c(0,0)),请通过更改vjust将标签放置在地块内.可能有一种方法可以使用annotate()或类似的方法在条形图上方绘制,如果有人知道如何使用,请在下面 comments .

Data and Packages

library(dplyr)
library(tidyr)
library(ggplot2)

# Sum species groups by HNV values and add factor levels for Animal_vegetal
hnvf4 <- hnvf3 %>%
  pivot_longer(
    cols = starts_with("HNV"),
    names_to = c("HNV"),
    names_prefix = "HNV_",
    values_to = "value1") |>
  filter(value1 == 1 & Animal_vegetal != "") |>
  select(-value1) |> 
  group_by(HNV, Animal_vegetal) |>
  summarise(count = n(), .groups = "drop") |>
  ungroup() |>
  mutate(Animal_vegetal = factor(Animal_vegetal, 
                                  levels = c("Animal species", 
                                             "Vegetal species", 
                                             "Both")))

Counts Plot

ggplot(data = hnvf4) +
  geom_bar(aes(x = HNV, y = count, fill = Animal_vegetal),
           stat = "identity") +
  stat_summary(aes(x = HNV, y = count, label = after_stat(y)),
               fun.y = "sum",
               geom = "text", 
               colour = "black",
               vjust = -1) +
  scale_x_discrete(labels=c("arable land", "grasslands", "mosaic landscape", 
                            "permanent croplands")) +
  scale_y_continuous(limits = c(0,100), 
                     breaks = c(0,25,50,75, 100),
                     expand = c(0,0)) +
  scale_fill_manual(values = c("#FDCDAC", "#B3E2CD","#CBD5E8")) +
  labs(x = "HNV farmland type", y="Number of studies", fill = "") +
  theme(axis.text.x = element_text(angle=90, vjust = 0.5, hjust=1), 
        axis.ticks.x = element_blank(),
        axis.line.y = element_line(linewidth = 0.5, colour = "black"),
        axis.ticks.length.y.left = unit(.25, "cm"),
        axis.title.y = element_text(margin = margin(r= 15)),
        panel.background = element_rect(fill = NA),
        legend.position = c(.99, .95),
        legend.justification = c("right", "top"))

result1

Proportions Plot

ggplot(data = hnvf4) +
  geom_bar(aes(x = HNV, y = count, fill = Animal_vegetal),
           stat = "identity",
           position = "fill") +
  stat_summary(aes(x = HNV, y = count, label = after_stat(y)),
               fun.y = "sum",
               geom = "text",
               position = "fill",
               colour = "black",
               vjust = -1) +
  scale_x_discrete(labels =c("arable land", "grasslands", "mosaic landscape", 
                             "permanent croplands")) +
  # scale_y_continuous(expand = c(0,0)) +
  coord_cartesian(clip = "off") +
  scale_fill_manual(values = c("#FDCDAC", "#B3E2CD","#CBD5E8") )+
  labs(x = "HNV farmland type", y="Proportion of studies", fill = "") +
  theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust = 1), 
        axis.ticks.x = element_blank(),
        axis.line.y = element_line(linewidth = 0.5, colour = "black"),
        axis.ticks.length.y.left = unit(.25, "cm"),
        panel.background = element_rect(fill = NA),
        axis.title.y = element_text(margin = margin(r = 15)))

result2

R相关问答推荐

如何将具有重复名称的收件箱合并到R中的另一列中,而结果不同?

是否可以 Select 安装不带文档的R包以更有效地存储?

基于现有类创建类的打印方法(即,打印tibles更长时间)

如何删除gggvenn与gggplot绘制的空白?

如何将dygraph调用到R Markdown作为一个shiny 的react 对象的参数?

2个Rscript.exe可执行文件有什么区别?

R spatstat Minkowski Sum()返回多个边界

合并后返回列表的数据帧列表

如何在R库GoogleDrive中完全删除预先授权的Google帐户?

调换行/列并将第一行(原始数据帧的第一列)提升为标题的Tidyr类似功能?

从数据创建数字的命名列表.R中的框

如何删除设置大小的曲线图并添加条形图顶部数字的百分比

创建在文本字符串中发现两个不同关键字的实例的数据框

如何显示准确的p值而不是<;0.001*?

将文本批注减少到gglot的y轴上的单个值

如何使用grepl()在数据帧列表中 Select 特定字符串?

reshape 数据帧-基于组将行转换为列

在子图内和子图之间对齐行数不均匀的表格罗布对

在shiny /bslb中,当卡片是从json生成时,如何水平排列卡片?

向数据添加标签