如何修复geom_text标签位置,使其始终位于图的中间?

时间:2013-11-22 18:17:13

标签: r ggplot2

我想创建一个生成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.upy.limit.bottom的函数,然后我可以指定y = (y.limit.up + y.limit.bottm) / 2或其他内容。

3 个答案:

答案 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)

产生这个。

enter image description here

如果你想要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")