我正在尝试从 Simpler population pyramid in ggplot2 帖子中重现简单的人口金字塔
使用 ggplot2
和 dplyr
(而不是 plyr
)。
这是带有 plyr
和种子的原始示例
set.seed(321)
test <- data.frame(v=sample(1:20,1000,replace=T), g=c('M','F'))
require(ggplot2)
require(plyr)
ggplot(data=test,aes(x=as.factor(v),fill=g)) +
geom_bar(subset=.(g=="F")) +
geom_bar(subset=.(g=="M"),aes(y=..count..*(-1))) +
scale_y_continuous(breaks=seq(-40,40,10),labels=abs(seq(-40,40,10))) +
coord_flip()
工作良好。
但是如何使用
dplyr
生成相同的图呢?该示例在 plyr
语句中使用 subset = .(g ==
。我用
dplyr::filter
尝试了以下操作,但出现错误:require(dplyr)
ggplot(data=test,aes(x=as.factor(v),fill=g)) +
geom_bar(dplyr::filter(test, g=="F")) +
geom_bar(dplyr::filter(test, g=="M"),aes(y=..count..*(-1))) +
scale_y_continuous(breaks=seq(-40,40,10),labels=abs(seq(-40,40,10))) +
coord_flip()
Error in get(x, envir = this, inherits = inh)(this, ...) :
Mapping should be a list of unevaluated mappings created by aes or aes_string
最佳答案
您可以通过在 data
中指定参数 geom_bar
来避免错误:
ggplot(data = test, aes(x = as.factor(v), fill = g)) +
geom_bar(data = dplyr::filter(test, g == "F")) +
geom_bar(data = dplyr::filter(test, g == "M"), aes(y = ..count.. * (-1))) +
scale_y_continuous(breaks = seq(-40, 40, 10), labels = abs(seq(-40, 40, 10))) +
coord_flip()
关于r - 带有 ggplot2 和 dplyr(而不是 plyr)的人口金字塔图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31897329/