我想创建一个生成ggplot图的函数。
data1 <- data.table(x=1:5, y=1:5, z=c(1,2,1,2,1))
data2 <- data.table(x=1:5, y=11:15, z=c(1,2,1,2,1))
myfun <- function(data){
ggplot(data, aes(x=x, y=y)) +
geom_point() +
geom_text(aes(label=y), y=3) +
facet_grid(z~.)
}
myfun(data2)
它应该在图形上标记一些文本。然而,如果事先不知道数据,我就无法手动调整文本的垂直位置。特别是,我不希望标签随着数据移动位置:我希望它始终保持在垂直于图的1/4处。(上至中)
我该怎么做呢?
有没有一个函数可以返回y.limit.up
和y.limit.bottom
,然后我就可以赋值y = (y.limit.up + y.limit.bottm) / 2
或者别的什么了。
发布于 2013-11-23 03:22:33
在geom_text(...)
中设置相对于刻面中的绘图比例的x或y位置实际上是一个相当大的问题。@agstudy的解决方案如果所有方面的的y标度都是相同的,那么它就可以工作。这是因为,在计算范围(或最大、最小等)时,ggplot
使用未设置子集的数据,而不是为适当方面(see this question)设置子集的数据。
不过,您可以使用辅助表来实现您想要的功能。
data1 <- data.table(x=1:5, y=1:5, z=c(1,2,1,2,1))
data2 <- data.table(x=1:5, y=11:15, z=c(1,2,1,2,1))
myfun <- function(data){
label.pos <- data[,ypos:=min(y)+0.75*diff(range(y)),by=z] # 75% to the top...
ggplot(data, aes(x=x, y=y)) +
geom_point() +
# geom_text(aes(label=y), y=3) +
geom_text(data=label.pos, aes(y=ypos, label=y)) +
facet_grid(z~., scales="free") # note scales = "free"
}
myfun(data2)
产生这样的结果。
如果你想要“修复”scales=,那么@agstudy的解决方案是可行的。
发布于 2013-11-23 02:36:53
您可以这样做,例如:
ggplot(data2, aes(x=x)) +
geom_point(aes(y=y)) +
geom_text(aes(label=y, y=mean(range(y)))) +
facet_grid(z~.)
或手动修复y限制:
scale_y_continuous(limits = c(10, 15))
发布于 2017-03-25 02:16:41
@user890739 :使用geom_density,你可以像这样估算一个ypos变量:
data<-dplyr::mutate(group_by(data, z), ypos=max(density(y)$y)*.75*nrow(data))
然后绘制结果:
ggplot(data, aes(x=x)) +
stat_density(aes(y=..density..)) +
geom_text(aes(label=y, y=ypos)) +
facet_grid(z~., scales="free")
https://stackoverflow.com/questions/20151765
复制相似问题