首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何确定geom_text标签的位置,使其始终位于绘图的中间?

如何确定geom_text标签的位置,使其始终位于绘图的中间?
EN

Stack Overflow用户
提问于 2013-11-23 02:17:13
回答 3查看 10.1K关注 0票数 5

我想创建一个生成ggplot图的函数。

代码语言:javascript
运行
复制
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或者别的什么了。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-11-23 03:22:33

geom_text(...)中设置相对于刻面中的绘图比例的x或y位置实际上是一个相当大的问题。@agstudy的解决方案如果所有方面的的y标度都是相同的,那么它就可以工作。这是因为,在计算范围(或最大、最小等)时,ggplot使用未设置子集的数据,而不是为适当方面(see this question)设置子集的数据。

不过,您可以使用辅助表来实现您想要的功能。

代码语言:javascript
运行
复制
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的解决方案是可行的。

票数 5
EN

Stack Overflow用户

发布于 2013-11-23 02:36:53

您可以这样做,例如:

代码语言:javascript
运行
复制
ggplot(data2, aes(x=x)) +
        geom_point(aes(y=y)) +
        geom_text(aes(label=y, y=mean(range(y)))) +
        facet_grid(z~.)

或手动修复y限制:

代码语言:javascript
运行
复制
scale_y_continuous(limits = c(10, 15))
票数 5
EN

Stack Overflow用户

发布于 2017-03-25 02:16:41

@user890739 :使用geom_density,你可以像这样估算一个ypos变量:

代码语言:javascript
运行
复制
data<-dplyr::mutate(group_by(data, z), ypos=max(density(y)$y)*.75*nrow(data))

然后绘制结果:

代码语言:javascript
运行
复制
ggplot(data, aes(x=x)) +
    stat_density(aes(y=..density..)) +
    geom_text(aes(label=y, y=ypos)) +
    facet_grid(z~., scales="free")
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20151765

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档