【问题标题】:Getting coordinates for the label locations from ggrepel从 ggrepel 获取标签位置的坐标
【发布时间】:2017-07-12 18:57:03
【问题描述】:

以下是使用 ggplot2 和 ggrepel 进行“标签位置优化”的示例:

x = c(0.8846, 1.1554, 0.9317, 0.9703, 0.9053, 0.9454, 1.0146, 0.9012, 
  0.9055, 1.3307)
y = c(0.9828, 1.0329, 0.931, 1.3794, 0.9273, 0.9605, 1.0259, 0.9542, 
  0.9717, 0.9357)
ShortSci = c("MotAlb", "PruMod", "EriRub", "LusMeg", "PhoOch", "PhoPho", 
         "SaxRub", "TurMer", "TurPil", "TurPhi")

df <- data.frame(x = x, y = y, z = ShortSci)
library(ggplot2)
library(ggrepel)
ggplot(data = df, aes(x = x, y = y)) + theme_bw() + 
  geom_text_repel(aes(label = z), 
                  box.padding = unit(0.45, "lines")) +
  geom_point(colour = "green", size = 3)

问题:是否有可能以某种方式获取标签位置的坐标作为向量?

非常感谢!

【问题讨论】:

标签: r ggplot2 ggrepel


【解决方案1】:

在@Henrik 建议的链接中,有许多有趣的想法可以获取ggrepel 标签位置。
这是个人的改造:

x = c(0.8846, 1.1554, 0.9317, 0.9703, 0.9053, 0.9454, 1.0146, 0.9012, 0.9055, 1.3307)
y = c(0.9828, 1.0329, 0.931, 1.3794, 0.9273, 0.9605, 1.0259, 0.9542, 0.9717, 0.9357)
ShortSci = c("MotAlb", "PruMod", "EriRub", "LusMeg", "PhoOch", "PhoPho", 
         "SaxRub", "TurMer", "TurPil", "TurPhi")
df <- data.frame(x = x, y = y, z = ShortSci)

library(ggplot2)
library(ggrepel)
p1 <- ggplot(data = df, aes(x = x, y = y)) + theme_bw() + 
  geom_text_repel(aes(label = z), 
                  box.padding = unit(0.45, "lines")) +
  geom_point(colour = "green", size = 3)
x11(width=7,height=7)
p1

# Get x and y plot ranges 
xrg <- ggplot_build(p1)$layout$panel_ranges[[1]]$x.range
yrg <- ggplot_build(p1)$layout$panel_ranges[[1]]$y.range

library(grid)
grid.force()
kids <- childNames(grid.get("textrepeltree", grep = TRUE))

# Function: get the x and y positions of a single ggrepel label
get.xy.pos.labs <- function(n) {
  grb <- grid.get(n)
  data.frame(
  x = xrg[1]+diff(xrg)*convertX(grb$x, "native", valueOnly = TRUE),
  y = yrg[1]+diff(yrg)*convertY(grb$y, "native", valueOnly = TRUE)
  )
}
# Get positions of all ggrepel labels
dts <- do.call(rbind, lapply(kids, get.xy.pos.labs))
dts$lab <- df$z
print(dts)

#            x         y    lab
# 1  0.8871681 0.9945523 MotAlb
# 2  1.1441033 1.0214568 PruMod
# 3  0.9431081 0.9194218 EriRub
# 4  0.9977394 1.3906067 LusMeg
# 5  0.8900197 0.9160821 PhoOch
# 6  0.9597605 0.9471191 PhoPho
# 7  1.0033184 1.0144658 SaxRub
# 8  0.8898377 0.9424059 TurMer
# 9  0.9340703 0.9722663 TurPil
# 10 1.3063754 0.9358787 TurPhi

# Plot labels using the positions calculated using get.xy.pos.labs      
p2 <- ggplot(data = df, aes(x = x, y = y)) + theme_bw() + 
  geom_text(aes(x=x,y=y, label=lab), data=dts, col="red")+
  geom_point(colour = "green", size = 3)
x11(width=7,height=7)
p2

2018 年 12 月更新
使用 ggplot2 版本 3.1.0 (及更新版本),您需要使用以下代码来获取 x 和 y 范围(有关详细信息,请参阅@VilmantasGegzna here 的答案):

# Get x and y plot ranges 
ggp1 <- ggplot_build(p1)
xrg <- ggp1$layout$panel_params[[1]]$x.range
yrg <- ggp1$layout$panel_params[[1]]$y.range

这是带有geom_text_repel 给出的标签的图,以及带有使用计算位置定位的标签的图。

【讨论】:

  • 非常感谢您这么长时间的返工。哇,这显然不是那么容易!
  • 这不再有效,大概是由于 ggplot2 版本更改。
  • @Phil 谢谢你的评论!我更新了我的答案。请检查它是否有效。如果是,请点赞我的回答。谢谢。
  • @MarcoSandri 答案不再有效,可能是ggrepel新版本的原因,能否请您更新答案?
  • @just_rookie 嗨。我用更新的包在 R 3.6.3 上测试了我的代码。有用。请尝试这里给出的代码:pastebin.com/EskmySZv。告诉我。
猜你喜欢
  • 2012-05-27
  • 2011-11-28
  • 2018-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-18
  • 2023-04-07
  • 1970-01-01
相关资源
最近更新 更多