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

时间:2015-07-20 00:40:24

标签: r ggplot2 pie-chart stacked-chart

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

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()

&#13;
&#13;
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())
&#13;
&#13;
&#13;

我想要18个饼图,看起来像this,但得到了这个空白的情节。请查看问题所在。 enter image description here

这是堆积图表

enter image description here

在这里你可以download the data

1 个答案:

答案 0 :(得分:6)

这有很多问题。主要的一点是你的+位置错误,但即使修复了这个问题,你也必须考虑一些问题。

  • +放在前一行的末尾,而不是第一行的开头。否则,第一行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())

enter image description here

这看起来并不像你所追求的那样,但至少它解决了你的许多初步问题,现在你可以正确思考你想要绘制/刻面的内容,这样你就可以修复其余部分。

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

每个Rot.Herb执行一个饼图 - &gt;将您的facet_grid(Rot.Herb ~ .)更改为facet_wrap( ~ Rot.Herb)。同时从原始ggplot调用中删除width=Rot.Herb,因为如何将width(数字)映射到Rot.Herb(字符串)?另请注意aes(x=1...) - &gt; 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)。< / p>

我会戴上我的思维阅读帽并假设“总杂草重量”是每个Rot.Herb的“平均质量”的总和(即每个Rot.Herb的所有物种的总和)。如果不是,您已经能够自己计算此列(您已经证明,当您从原始weedweight计算出data时,您可以执行此操作 - 做得好)。 因此,您只需将此宽度列添加到您的weedweights:

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())
    

enter image description here