【问题标题】:Place text at a fixed distance from chart将文本放置在与图表的固定距离处
【发布时间】:2012-12-15 00:00:24
【问题描述】:

请帮助我找到一种通用方法,将文本放置在距绘图区域右侧恒定距离的位置,如下图所示。由于绘图区域在右侧较窄,不幸的是,当前放置计算将文本定位在左侧太远。注意文本是右对齐的。

我的最后一个想法:如果我们知道 x=1 和 x=2 之间的距离(以厘米为单位),我们就可以轻松计算出位置。不幸的是,显然是not that easy 才能达到那个距离。

仅供参考:我不想标记这些线条。

Full-size image

library(ggplot2)
library(reshape)
library(gridExtra)

df = data.frame(x =(1:3),One=c(12, 8, 13),Two=c(13, 7, 11),Three=c(11, 9, 11))
df.melt = melt(df, id.vars="x")
xmax = max(df.melt$x); xmin = min(df.melt$x)
ymax = max(df.melt$value); ymin = min(df.melt$value)

dfa = data.frame(x=(xmax-xmin)*1.15+xmin, y=c(11,12,13.5), ann=c("10.1|","1.1|","Texttexttext|"))
dfa.melt = melt(dfa, id.vars=c("x","ann"))

p = ggplot() + 
  geom_line(data=df.melt,  aes(x=x, y=value, color=variable), show_guide=F) +
  geom_text(data=dfa.melt, aes(x=x, y=value, hjust = 1, label=ann), size=3) + 
  coord_cartesian(xlim=c(xmin,xmax), ylim=c(ymin,ymax))

p1 = p + theme(plot.margin=unit(c(1,3,0,0),"cm"), axis.text.y=element_text(size=10))
p2 = p + theme(plot.margin=unit(c(1,3,0,3),"cm"), axis.text.y=element_text(size=35))
p1c <- ggplot_gtable(ggplot_build(p1))
p1c$layout$clip[p1c$layout$name=="panel"] <- "off"
p2c <- ggplot_gtable(ggplot_build(p2))
p2c$layout$clip[p2c$layout$name=="panel"] <- "off"
grid.arrange(p1c, p2c, ncol=2)

【问题讨论】:

    标签: r ggplot2 positioning


    【解决方案1】:

    因为一切都被命名了,所以可以访问 绘图的任何组件使用 网格函数。

    问题是 ggplot2 在绘制绘图时会创建许多视口和 grobs。所以对这个情节进行修改并不容易。 我还注意到,每次执行新的绘图时,grobs 和视口的名称都会发生变化。所以我试图通过一些标准(这里深度 = 4)来获取视口

    #Get the viewports: 
    scene.vps <- grid.ls(viewports=T,grobs=F)
    scene.flat <- as.data.frame(do.call('cbind',scene.vps))
    vps <- subset(scene.flat ,vpDepth == '4')$name[1:2]
    vps <- as.character(vps)
    
    
    # modify the plot by grid.text
    depth <- downViewport(vps[1])
    grid.text("1.1|",x=unit(1, "npc") - unit(1, "mm"),
                     y=unit(1, "npc") - unit(20, "mm"),
                     just=c("right", "top"))
    
    grid.text("10.1|",x=unit(1, "npc") - unit(1, "mm"),
                      y=unit(1, "npc") - unit(60, "mm"),
                      just=c("right", "top"))
    
    grid.text("Texttexttext|",x=unit(1, "npc") - unit(10, "mm"),
                              y=unit(1, "npc") -unit(2,'mm'),
              just=c("right", "top"))
    
    upViewport(depth)  # come back to the root viewport
    
    depth <- downViewport(vps[2])
    
    grid.text(...
    

    【讨论】:

    • 谢谢。我认为,您的答案是从网格的最右边与图的右侧测量的。见HERE。此外,将文本定位在特定的 y 值上有些困难。在我的示例中,文本准确地放置在y=11y=12
    • @Frank 是从右边是的。这是参考问题。是否需要将文本放置在 y=11,12 处?
    • 是的,如果 y 位置与图表坐标相关,那就太好了。无论如何,通过我的另一个问题(LINK) 的解决方案,它应该是可能的。明年将完成我的申请。感谢您对这两个问题的帮助!
    猜你喜欢
    • 1970-01-01
    • 2022-12-29
    • 2011-12-01
    • 2017-10-27
    • 2021-08-01
    • 2022-06-23
    • 2012-12-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多