我想编写一个简单的函数,可以通过点图可视化某些分布。 在图中,文本注释应显示点图中显示的随机生成数据的值。
这是一个简化的示例,我可以为用于生成数据的正态分布的均值和标准差选择一个值。
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)
。
a)一种将文本框与绘图右侧对齐的方法,无论字符串的长度如何
是的。使用
Inf
作为 x
坐标,并且 hjust = 1
。
采用 (x,y) 精确的坐标来设置文本,由
x=
和 y=
映射给出。 hjust
表示文本的哪个点将位于该坐标:
hjust = 0
时,文本的开头将位于该坐标,这意味着文本左对齐。hjust = 0.5
,则文本的中间将锚定在(x,y),使其居中对齐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
添加一些填充。