我的资料:
day variable value
1 Fri avg1 446.521127
2 Mon avg1 461.676056
3 Sat avg1 393.366197
4 Sun avg1 435.985714
5 Thu avg1 445.571429
6 Tue avg1 441.549296
7 Wed avg1 462.042254
8 Fri avg2 7.442113
9 Mon avg2 7.694648
10 Sat avg2 6.556056
11 Sun avg2 7.266571
12 Thu avg2 7.426286
13 Tue avg2 7.359577
14 Wed avg2 7.700282
我的问题是我想facet_grid
通过按日显示每组平均数据来创建条形图,但是观察到的结果非常相似,以至于我发现使用来指定y极限会有所帮助scale_y_continuous
。
因此,如果将ggplot分配给g <- ggplot(df, aes(x=day, y=value))
,则可以通过以下两种方式获得所需的一半:
g + geom_bar(stat="identity") + facet_grid(variable~., scales="free")
和
g + geom_bar(stat="identity") + scale_y_continuous(limits=c(300,500), oob=rescale_none)
但是,我不知道如何使用构面网格然后指定scale_y_cont来限制单独的y轴的大小。有解决方案吗?
您可以在使用时为不同的面创建单独的y范围geom_point
,但是我不知道使用的方法geom_bar
。要使用facet_wrap
和设置特定的y范围,geom_bar
我知道的唯一方法是创建单独的图,然后grid.arrange
从gridExtra
包中将它们并排放置。(使用不降为零的垂直比例会夸大点/条之间的差异,这可能会引起误解,但您必须确定它是否适合您的特定情况。)
首先,这里是geom_point
版本:想法是创建一个“虚拟”数据框,其中包含您想要的ylim上下限值,然后使用绘制它们geom_blank
。geom_blank
不会绘制任何内容,但是添加此几何图形将确保轴范围是您希望每个小平面的范围。
ddummy = data.frame(day=NA, variable=rep(c("avg1", "avg2"), each=2),
value=c(0.5*max(df$value[df$variable=="avg1"]),
1.1*max(df$value[df$variable=="avg1"]),
0.5*max(df$value[df$variable=="avg2"]),
1.1*max(df$value[df$variable=="avg2"])))
g <- ggplot(df, aes(x=day, y=value))
g + geom_point() +
geom_blank(data=dummy, aes(day, value)) +
facet_grid(variable ~ ., scales="free")
这是单独的地块,与grid.arrange
:
avg1 = ggplot(df[df$variable=="avg1",], aes(x=day, y=value)) +
geom_bar(stat="identity") +
facet_wrap(~variable) +
coord_cartesian(ylim=c(300,500))
avg2 = ggplot(df[df$variable=="avg2",], aes(x=day, y=value)) +
geom_bar(stat="identity") +
facet_wrap(~variable) +
coord_cartesian(ylim=c(3.5,8))
gridExtra::grid.arrange(avg1, avg2, ncol=2)
要使用geom_segment
(根据您的评论),您可以这样做:
library(dplyr)
ggplot(df %>% group_by(variable) %>%
mutate(ymin=0.5*max(value))) +
geom_segment(aes(x=day, xend=day, y=ymin, yend=value),
size=5, colour=hcl(195,100,65)) +
facet_grid(variable ~ ., scales="free")
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句