【发布时间】:2017-08-27 19:34:39
【问题描述】:
我正在ggplot 中创建一个图表,其中我有一个条形图,然后想要覆盖多个折线图。出于这个问题的目的,我已经为两个条形图(一个包括所有年份(2007-2015)和两个特定年份(2007 和 2015))复制了我的代码,但最终我将覆盖 10 个不同年份的数据。使用的数据可以在here找到。
library(dplyr)
library(tidyr)
library(gridExtra)
library(ggplot2)
overallpierc<-data[(data$item=="piercing"),]
overp<-overallpierc %>%
group_by(age) %>%
count(sex) %>%
ungroup %>%
mutate(age = factor(age)) %>%
complete(age, sex, fill = list(n = 0)) %>%
ggplot(aes(age, n)) + geom_col(aes(fill = sex), position = "dodge") +
theme_classic() +
scale_fill_manual(values=c("#000000", "#CCCCCC"), name = "Sex") +
labs(x = "Age", y = "Number of observations") +
theme(legend.position=c(0.4,0.8),
plot.title = element_text(size = 10),
legend.title=element_text(size=15),
axis.title=element_text(size=15),
legend.key.size = unit(1.13, "cm"),
legend.direction="vertical",
legend.text=element_text(size=15))
p07<-data[(data$yy=="2007") & (data$item=="piercing"),]
summary(p07)
subp07<-p07 %>%
group_by(age) %>%
count(sex) %>%
ungroup %>%
mutate(age = factor(age)) %>%
complete(age, sex, fill = list(n = 0)) %>%
ggplot(aes(age, n)) + geom_col(aes(fill = sex), position = "dodge") +
theme_classic() +
scale_fill_manual(values=c("#000000", "#CCCCCC"), name = "Sex") +
labs(x = "Age", y = "Number of observations") +
theme(legend.position=c(0.4,0.8),
plot.title = element_text(size = 10),
legend.title=element_text(size=15),
axis.title=element_text(size=15),
legend.key.size = unit(1.13, "cm"),
legend.direction="vertical",
legend.text=element_text(size=15))
p15<-data[(data$yy=="2015") & (data$item=="piercing"),]
subp15<-p15 %>%
group_by(age) %>%
count(sex) %>%
ungroup %>%
mutate(age = factor(age)) %>%
complete(age, sex, fill = list(n = 0)) %>%
ggplot(aes(age, n)) + geom_col(aes(fill = sex), position = "dodge") +
theme_classic() +
scale_fill_manual(values=c("#000000", "#CCCCCC"), name = "Sex") +
labs(x = "Age", y = "Number of observations") +
theme(legend.position=c(0.4,0.8),
plot.title = element_text(size = 10),
legend.title=element_text(size=15),
axis.title=element_text(size=15),
legend.key.size = unit(1.13, "cm"),
legend.direction="vertical",
legend.text=element_text(size=15))
grid.arrange(overp, subp07, subp15)
我要做的是在总频率的条形图顶部绘制 2007 年和 2015 年女性的频率以及 2007 年和 2015 年男性的频率(这也反映在图例中)。有没有办法在R 中使用ggplot2 做到这一点?
更新:我尝试使用 geom_smooth 和 geom_line 函数将这些行添加到我的 ggplot 中,如 cmets 中的建议以及其他用户问题的解决方案,但我得到了以下错误:
错误:提供给连续刻度的离散值
我为要绘制的子集创建了一个新数据框:
df<-data.frame(age=c(15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,40,50,60), val=c(0,5,13,77,70,106,62,51,46,27,46,16,22,16,14,48,21, 3,4))
然后将其添加到ggplot代码中:
overallpierc %>%
filter(age != "15") %>%
group_by(age) %>%
count(sex) %>%
ungroup %>%
mutate(age = factor(age)) %>%
complete(age, sex, fill = list(n = 0)) %>%
ggplot(aes(age, n)) +
geom_line(data=df,aes(x=as.numeric(age),y=val),colour="blue") +
geom_col(aes(fill = sex), position = "dodge") +
theme_classic() +
scale_fill_manual(values=c("#000000", "#CCCCCC"), name = "Sex") +
labs(x = "Age", y = "Number of observations") +
theme(legend.position=c(0.4,0.8),
plot.title = element_text(size = 10),
legend.title=element_text(size=15),
axis.title=element_text(size=15),
legend.key.size = unit(1.13, "cm"),
legend.direction="vertical",
legend.text=element_text(size=15))
Others也遇到过类似问题,使用as.numeric解决问题。但是,出于绘图的目的,需要将年龄视为一个因素。
【问题讨论】:
-
你能简单地将 geom_smooth 添加到你的 ggplot 基于一个数据框,每个年龄的值是观察的数量吗?
-
是的,但我希望学习如何编写更复杂的解决方案,而不是每次都必须创建一个单独的数据框,因为我在我的论文中一直遇到这个问题。
-
我的论文也遇到了类似的问题,我定义了一个对数据帧进行操作并生成所需结果数据帧的函数。在调用 ggplot 组件时,我将 data 参数设置为我的数据框的函数,即 + geom_smooth(data=aggregatingFunction(df),aes ...)
-
您会考虑使用堆叠条吗?这将在同一个栏中按性别和总频率为您提供频率。然后你只需按年分面。如果这听起来有用,我会发布一个示例。
-
@BlunderingEcologist 看着 stackoverflow.com/questions/16350720/… 我可能会建议:
geom_point(data=fun(data),aes(x=age, y=nObs, group=1),stat='summary', fun.y=sum) + stat_summary(fun.y=sum, geom="line")