基于大小的饼图代码不起作用

Size based pie chart code doesn't work

我想将此附加图表重现为多个饼图,其半径由总杂草重量定义。这是我使用的代码:

weedweights<-data%>%
  select(-ends_with("No"))%>%
     gather(key=species, value=speciesmass, DIGSAWt:POLLAWt)%>%
     mutate(realmass= (10*speciesmass) / samplearea.m.2.)%>%
     group_by(Rot.Herb, species)%>%
     summarize(avgrealmass=mean(realmass, na.rm=TRUE))%>%
     filter(avgrealmass != "NaN")%>%
     ungroup()

ggplot(weedweights, aes(x=Rot.Herb, y=avgrealmass, fill=species, width=Rot.Herb)) +
  geom_bar(position = "fill", stat="identity") +
  facet_grid(Rot.Herb ~ .) + 
  coord_polar("y") +
  theme(axis.text.x = element_blank())

我想要 18 个饼图,有点像 this 但得到的是空白图。请看看问题出在哪里。

这是堆积图

在这里你可以download the data

这有很多问题。最主要的是你的 + 放错了地方,但即使修复了这个问题,你也必须考虑一些问题。

  • + 放在前一行的末尾,而不是第一行的开头。否则第一行 ggplot(...) 看起来像一个完整的语句(R 怎么知道下一行有一个 + ?)即第一行的 ggplot(...) + 和后续行的 function_call(...) +所以 R 知道有一个延续。
  • opts 已弃用。请改用 theme
  • theme_blank 已弃用。请改用 element_blank
  • "At least one layer must contain all variables used for facetting" - 您正在 avgrealmass1 ~ avgrealmass2 分面,但是 none 图层中有这些变量,您的数据框也没有。我不确定这样做的目的是什么。
  • 您有 width=kg.haweedweights 没有 kg.ha 列。

修复(或省略)这些问题会产生:

ggplot(weedweights, aes(x=Rot.Herb, y=avgrealmass, fill=species)) +#, width=kg.ha)) +
geom_bar(position = "fill", stat="identity") +
#facet_grid(avgrealmass1~avgrealmass2) +
coord_polar("y") +
theme(axis.text.x = element_blank())

这看起来不太像你想要的,但至少它解决了你最初的很多问题,现在你可以好好想想你想要什么 plot/facet 这样你可以解决剩下的问题。


编辑 更新以响应 OP 完全改变原始问题...

每个 Rot.Herb 做一个饼图 -> 将 facet_grid(Rot.Herb ~ .) 更改为 facet_wrap( ~ Rot.Herb)。还要从原始 ggplot 调用中删除 width=Rot.Herb,因为如何将宽度(数字)映射到 Rot.Herb(字符串)?还要注意 aes(x=1...) --> x 只是一个虚拟变量,不管它是什么。

ggplot(weedweights, aes(x=1, y=avgrealmass, fill=species)) +
  geom_bar(position = "fill", stat="identity") +
  facet_wrap(~ Rot.Herb) + 
  coord_polar("y") +
  theme(axis.text.x = element_blank())

现在你说你想根据杂草总重量改变每个饼图的宽度(虽然你没有解释如何获得这个,因为 weedweights 只有一列 avgrealmass) .

我会戴上读心术的帽子并假设 "total weed weight" 是每个 Rot.Herb 的 "avgrealmass" 的总和(即每个 [=27 的所有物种的总和) =]).如果不是,则您已经能够自己计算此列(您已经展示了在根据原始 data 计算 weedweight 时可以做到这一点 - 做得好)。 所以,你只需将这个宽度列添加到你的 weedweights:

ww2 <- weedweights %>%
         group_by(Rot.Herb) %>%
         mutate(totalweedweight=sum(avgrealmass)) %>%
         ungroup()

然后像以前一样使用 ggplot 进行以下更改:

  • width=totalweedweight: 将宽度列添加到 ggplot 调用中。
  • x=totalweedweight/2:所有这一切都是为了确保每个饼图都是 "left-aligned",就像原来的那样,即饼图是一个圆圈而不是一个环(将其保留为 x=1 你会明白我的意思的)。

    ggplot(ww2, aes(x=totalweedweight/2, y=avgrealmass, fill=species, width=totalweedweight)) +
      geom_bar(position = "fill", stat="identity") +
      facet_wrap(~ Rot.Herb) + 
      coord_polar("y") +
      theme(axis.text.x = element_blank())