【问题标题】:Size based pie chart code doesn't work基于大小的饼图代码不起作用
【发布时间】:2015-07-20 00:40:23
【问题描述】:

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

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

【问题讨论】:

  • @Jaap:非常感谢编辑
  • 您必须更具体地了解您想要的输出。您想要每个 Rot.Herb 一个饼图吗?每个物种?在您链接的示例中,还有其他变量指定每个饼图所在的(行、列)-您需要这样做,还是任何排序/放置都需要?此外,您提到宽度应随“总杂草重量”而变化,但您的 weedweight 数据框只有 avgrealmass - 这两者有什么关系? (最后,在一个可重现的示例中,您应该提供指向 weedweight 数据框的链接,而不是我们必须转换的原始 data)。

标签: r ggplot2 pie-chart stacked-chart


【解决方案1】:

这有很多问题。主要问题是您的+ 放错了位置,但即使解决了这个问题,您也必须考虑一些问题。

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

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

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

【讨论】:

  • 非常感谢您的澄清。我对代码进行了修改,但无法解决问题。我将新代码和新问题添加到原始问题中
  • 您的新问题与旧问题完全不同,所以现在记录混乱(我的答案是您的旧问题)。因为它已经完成了,所以暂时搁置它,但是将来当您从根本上改变您的问题时,您应该提出一个新问题。有一个可重复的例子。
  • 好的,我已经回答了你的新问题。
  • 非常感谢!问一个好问题对每个人都很方便。下次我会问更好的问题
  • 为什么你的传说和我的不一样?我有一条连续的颜色丝带,而你用一条细白线将它们分开。我正在使用最新的 R 版本
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-03
相关资源
最近更新 更多