我最近更新了ggplot2
软件包并遇到了一些主要问题,使用facets
为每个组的平均值绘制水平线。
我相信this帖子不再有效?
我正在使用以下代码创建时间序列图:
ggplot(p2p_dt_SKILL_A,aes(x=Date,y=Prod_DL)) +
geom_line(aes(colour="red"),lwd=1.3) +
geom_smooth() +
geom_line(stat = "hline", yintercept = "mean")+
scale_x_date(labels=date_format("%b-%y"),breaks ="2 month")+
geom_vline(xintercept = as.numeric(p2p_dt_SKILL_A$Date[p2p_dt_SKILL_A$Date=="2015-09-18"]))+
geom_vline(xintercept = as.numeric(p2p_dt_SKILL_A$Date[p2p_dt_SKILL_A$Date=="2015-10-02"]))+
geom_vline(xintercept = as.numeric(p2p_dt_SKILL_A$Date[p2p_dt_SKILL_A$Date=="2015-10-23"]))+
ylab("DL Prod for All Skills")+
ggtitle("BVG1 DL Prod for All Skills 2014-2015")+
theme(axis.title.y = element_text(size = 15,face="bold",color="red"),
plot.title = element_text(size = 15,lineheight = .8,face="bold",color="red"),
axis.title.x = element_blank(),
legend.position="none")+
facet_wrap(~Patch)
问题1是我无法再使用stat = "hline"
中的geom_line(stat = "hline", yintercept = "mean")
,因为它会出现以下错误:Error: No stat called StatHline
。
所以我把它改成了:
ggplot(p2p_dt_SKILL_A,aes(x=Date,y=Prod_DL)) +
geom_line(aes(colour="red"),lwd=1.3) +
geom_smooth() +
geom_hline(yintercept = mean(p2p_dt_SKILL_A$Prod_DL))+
scale_x_date(labels=date_format("%b-%y"),date_breaks ="2 month")+
geom_vline(xintercept = as.numeric(p2p_dt_SKILL_A$Date[p2p_dt_SKILL_A$Date=="2015-09-18"]))+
geom_vline(xintercept = as.numeric(p2p_dt_SKILL_A$Date[p2p_dt_SKILL_A$Date=="2015-10-02"]))+
geom_vline(xintercept = as.numeric(p2p_dt_SKILL_A$Date[p2p_dt_SKILL_A$Date=="2015-10-23"]))+
ylab("DL Prod for All Skills")+
ggtitle("BVG1 DL Prod for All Skills 2014-2015")+
theme(axis.title.y = element_text(size = 15,face="bold",color="red"),
plot.title = element_text(size = 15,lineheight = .8,face="bold",color="red"),
axis.title.x = element_blank(),
legend.position="none")+
facet_wrap(~Patch)
但是这并没有在每个Patch的平均值上绘制水平线。它只需Prod_DL
的整体均值
见下文:
现在有什么新的方法可以计算每组的平均值并绘制水平线吗?
由于
更新
这是我做的:
#first create a dataframe which holds patch and mean values for prod dl, this will then be used in geom_hline()
mean_Prod_DL <- p2p_dt_SKILL_A%>%
group_by(Patch)%>%
summarise(mean_Prod_DL_per_patch = mean(Prod_DL))
ggplot(p2p_dt_SKILL_A,aes(x=Date,y=Prod_DL)) +
scale_x_date(labels=date_format("%b-%y"),date_breaks ="2 months")+
geom_line(aes(colour="red"),lwd=1.3) +
geom_smooth() +
geom_hline(data = mean_Prod_DL,aes(yintercept = mean_Prod_DL_per_patch),lty=2)+
geom_vline(xintercept = as.numeric(p2p_dt_SKILL_A$Date[p2p_dt_SKILL_A$Date=="2015-09-18"]))+
geom_vline(xintercept = as.numeric(p2p_dt_SKILL_A$Date[p2p_dt_SKILL_A$Date=="2015-10-02"]))+
geom_vline(xintercept = as.numeric(p2p_dt_SKILL_A$Date[p2p_dt_SKILL_A$Date=="2015-10-23"]))+
geom_vline(xintercept = as.numeric(p2p_dt_SKILL_A$Date[p2p_dt_SKILL_A$Date=="2015-12-04"]))+
ylab("DL Prod for All Skills")+
ggtitle("BVG1 DL Prod for All Skills 2014-2016")+
theme(axis.title.y = element_text(size = 15,face="bold",color="red"),
plot.title = element_text(size = 15,lineheight = .8,face="bold",color="red"),
axis.title.x = element_blank(),
legend.position="none")+
facet_wrap(~Patch)
答案 0 :(得分:4)
我同意@MLavoie的看法,只计算感兴趣的数量是最简单的解决方案。不确定以什么方式寻找更好的东西&#39;。
示例:
# sample data
my_df <- data.frame(x=rep(1:100, 4),
y=cumsum(rnorm(400)),
category=rep(letters[1:4], each=100))
# calculate the hline data in one line with data.table
library(data.table)
setDT(my_df)[, cat_mean := mean(y), by=category]
# plot
ggplot(my_df, aes(x=x, y=y, group=category)) +
geom_line(color='red') +
geom_smooth(color='blue') +
geom_hline(aes(yintercept=cat_mean)) +
facet_wrap(~category)
结果: