基于大小的饼图代码不起作用
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.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())
这看起来不太像你想要的,但至少它解决了你最初的很多问题,现在你可以好好想想你想要什么 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())
我想将此附加图表重现为多个饼图,其半径由总杂草重量定义。这是我使用的代码:
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.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())
这看起来不太像你想要的,但至少它解决了你最初的很多问题,现在你可以好好想想你想要什么 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())