3

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

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 个饼图,有点像这样 ,但得到了这个空白图。请看问题出在哪里。 在此处输入图像描述

这是堆积图

在此处输入图像描述

在这里你可以下载数据

4

1 回答 1

6

这有很多问题。主要的一个是你+在错误的地方,但即使这个问题得到解决,你也必须考虑一些问题。

  • 将 the+放在前一行的末尾,而不是第一行的开头。否则第一行ggplot(...)看起来像一个完整的语句(R 怎么知道下一行有一个 +?),即ggplot(...) +在第一行和function_call(...) +后续行,所以 R 知道有一个延续。
  • opts已弃用。改为使用theme
  • theme_blank已弃用。改为使用element_blank
  • “至少一个图层必须包含用于分面的所有变量” - 您正在分面avgrealmass1 ~ avgrealmass2,但您的图层中没有这些变量,您的数据框也没有。我不确定这样做的目的是什么。
  • 你有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())

在此处输入图像描述

这看起来并不完全符合您的要求,但至少它解决了很多您最初的问题,现在您可以正确考虑要绘制/刻面的内容,以便您可以解决其余问题。


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

这会为每个饼图做一个Rot.Herb-> 将您的更改facet_grid(Rot.Herb ~ .)facet_wrap( ~ Rot.Herb). 还要width=Rot.Herb从原始 ggplot 调用中删除,因为如何将宽度(数字)映射到 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)。

我会戴上我的读心术,假设“总杂草重量”是每个“平均质量”的总和Rot.Herb(即每个物种的总和Rot.Herb)。如果不是,则您已经能够自己计算此列(您已经表明,当您weedweight从原始计算中可以做到这一点data- 做得好)。因此,您只需将此宽度列添加到您的杂草权重中:

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

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

  • width=totalweedweight:将宽度列添加到 ggplot 调用中。
  • x=totalweedweight/2:所有这一切都是为了确保每个饼图都是“左对齐”的,也就是说,饼图是一个圆圈而不是一个环(让它保持原样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())
    

在此处输入图像描述

于 2015-07-20T02:39:07.310 回答