我想创建一个生成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
或其他内容。
答案 0 :(得分:5)
相对于构面中的绘图比例设置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)
产生这个。
如果你想要scale =“fixed”,那么@ agstudy的解决方案就是你的选择。
答案 1 :(得分:4)
您可以这样做:
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))
答案 2 :(得分:0)
@ 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")