如何灵活(右)对齐ggplot中的geom_text()注释?

问题描述 投票:0回答:1

我想编写一个简单的函数,可以通过点图可视化某些分布。 在图中,文本注释应显示点图中显示的随机生成数据的值。

这是一个简化的示例,我可以为用于生成数据的正态分布的均值和标准差选择一个值。

my_fun <- function(chosen_mean, chosen_sd) {
  x <- rnorm(50, mean = chosen_mean, sd = chosen_sd)
  data <- data.frame(x)
  p <- ggplot(data, aes(x = x)) +
    geom_dotplot() +
    theme_classic()
  
  annotations <- data.frame(
    xpos = c(Inf,Inf,-Inf),
    ypos =  c(Inf,-Inf,-Inf),
    annotateText = c("text 1",
                     "text 2", 
                     paste0("M = ", chosen_mean, ", SD = ", chosen_sd)),
    hjustvar = c(1.1, 1.1, -2),
    vjustvar = c(5 , -22, -19)) 
  
  p <- p + 
    geom_text(data=annotations,aes(x=xpos,y=ypos,hjust=hjustvar,
                                   vjust=vjustvar,label=annotateText)) 
  
  p
}

my_fun(0, 1)
my_fun(1000, 200)

根据

paste0("M = ", chosen_mean, ", SD = ", chosen_sd)
由于不同的平均值和标准差值而生成的字符串的长度,此文本框将在图中移动。我认为原因是我使用了一些固定的
hjustvar
vjustvar
值(此处:-2 和 -19),以便文本框大致位于我想要的位置。 我不明白这个注释系统是如何工作的(我只是从这篇文章改编而来)所以它非常hacky。

我现在的问题是,是否有一种方法可以将文本框与绘图的右侧对齐,而不管字符串的长度如何;b)一种更优雅的方法来实现这一点,我什至不必使用不同文本的单独文本框,但可以只使用一个右对齐文本框,其中的字符串写为例如

paste0("text 1\ntext 2\nM = ", chosen_mean, " , SD = ", chosen_sd)

r ggplot2
1个回答
0
投票

a)一种将文本框与绘图右侧对齐的方法,无论字符串的长度如何

是的。使用

Inf
作为
x
坐标,并且
hjust = 1

采用 (x,y) 精确的坐标来设置文本,由

x=
y=
映射给出。
hjust
表示文本的哪个点将位于该坐标:

  • hjust = 0
    时,文本的开头将位于该坐标,这意味着文本左对齐。
  • 如果
    hjust = 0.5
    ,则文本的中间将锚定在(xy),使其居中对齐
  • hjust = 1
    会将文本的结尾设置为 (x,y) 右对齐。

如果超出 0-1 范围:例如,

-1
会将文本开头之前的点锚定到 (x,y),因此在实践中,您需要左对齐并添加一个利润。有点像设置
hjust = 0
并在字符串的开头添加一堆空格。相反的情况适用于大于 1 的值:它们将右对齐并添加边距。

如果你想象一条连续的线,在字符串的开头有

0

,在字符串的结尾有 
1
,那么
就更容易理解了。
hjust
是您想要锚定到的线的点 (
_x_
,
_y_
)。

vjust
的工作方式相同,但适用于底部 (
0
)、中间 (
0.5
) 和顶部 (
1
)。

b)一种更优雅的实现方式,我什至不必为不同的文本使用单独的文本框,而可以只使用一个带有字符串的右对齐文本框

不确定这是否是您想要的,但也许

y = Inf, hjust = 1
(在 y 轴末端右对齐)可以解决问题。您甚至可以使用
hjust=1.2
添加一些填充。

© www.soinside.com 2019 - 2024. All rights reserved.