我有一个带有水平线和垂直线的散点图,它描绘了阈值,因此它们将图分成四个象限。我想标记象限。我认为最好的方法是在图表的四个角落中的每个角落都有一个数字(欢迎提供其他建议!)。
我设法将文字放入每个象限的角落,但这些位置并不完美。我认为问题与轴的缩放不同(值的范围大致相同,但我的图的宽度大约是高度的三倍)这一事实有关。
目前我按以下方式进行。首先,我用点和两条线创建图形,然后我构建它以获得两个轴的范围,我使用它来调整文本的位置。
plot.build = ggplot_build(plot)
xpos = numeric(4)
xpos[2] = xpos[3] = plot.build$panel$ranges[[1]]$x.range[1]
xpos[1] = xpos[4] = plot.build$panel$ranges[[1]]$x.range[2]
ypos = numeric(4)
ypos[1] = ypos[2] = plot.build$panel$ranges[[1]]$y.range[2]
ypos[3] = ypos[4] = plot.build$panel$ranges[[1]]$y.range[1]
plot = plot + geom_text(aes(x2,y2,label = texthere),
data.frame(x2=xpos, y2=ypos, texthere=c("1", "2", "3", "4")),
color="#4daf4a", size=4)
基本上这是有效的,但由于缩放,两个轴的数字和边框之间的空间不同。我试图调整文本的x位置,但是ggplot只是扩展了值的范围,位置(相对于边框)保持不变。有没有办法在不改变值范围的情况下移动文本?
提前致谢!
答案 0 :(得分:25)
此示例使用Inf
& -Inf
值将文本放置在角落,然后将hjust
和vjust
参数放置在geom_text中,以便将文本放置在图中。使用hjustvar
和vjustvar
将它们放置在图表的内部或外部。
正如@baptiste所提到的,最好为注释使用新的数据集
df <- data.frame(x2=rnorm(100),y2=rnorm(100));library(ggplot2)
annotations <- data.frame(
xpos = c(-Inf,-Inf,Inf,Inf),
ypos = c(-Inf, Inf,-Inf,Inf),
annotateText = c("Bottom Left (h0,v0)","Top Left (h0,v1)"
,"Bottom Right h1,v0","Top Right h1,v1"),
hjustvar = c(0,0,1,1) ,
vjustvar = c(0,1,0,1)) #<- adjust
ggplot(df, aes(x2, y2)) + geom_point()+
geom_text(data=annotations,aes(x=xpos,y=ypos,hjust=hjustvar,vjust=vjustvar,label=annotateText))
如果我们想要更改任何文字位置,我们会调整hjustvar
的水平位置和vjustvar
的垂直位置。
# How To Adjust positions (away from corners)
annotations$hjustvar<-c(0, -1.5, 1, 2.5) # higher values = right, lower values = left
annotations$vjustvar<-c(0,1,0,1) # higher values = up, lower values = down
ggplot(df, aes(x2, y2)) + geom_point()+
geom_text(data = annotations, aes(x=xpos,y=ypos,hjust=hjustvar,
vjust=vjustvar,label=annotateText))
希望这有效!
答案 1 :(得分:9)
添加注释时,请确保提供新数据集或使用注释,否则将叠加多个标签,从而产生锯齿状外观。这是另一个答案的最小变化,
df <- data.frame(x2=rnorm(100),y2=rnorm(100))
library(ggplot2)
annotations <- data.frame(
xpos = c(-Inf,-Inf,Inf,Inf),
ypos = c(-Inf, Inf,-Inf,Inf),
annotateText = c("Text","tExt","teXt","texT"),
hjustvar = c(0,0,1,1) ,
vjustvar = c(0,1.0,0,1))
ggplot(df, aes(x2, y2)) + geom_point()+
geom_text(data = annotations, aes(x=xpos,y=ypos,hjust=hjustvar,
vjust=vjustvar,label=annotateText))
答案 2 :(得分:3)
只是想我会扩展给出的答案并产生一些看起来更美观的东西。起初,使用 hjust 和 vjust 时文本移动的方向可能看起来有点违反直觉(至少对我而言),因此我对每一行进行了注释以帮助其他人理解。
library(tidyverse)
##Example 1
annotations1 <- data.frame(
xpos = c(-Inf, -Inf, Inf, Inf), ypos = c(-Inf, Inf, -Inf, Inf), #left-bottom, left-top, right-bottom, right-top
annotateText = c("Text", "tExt", "teXt", "texT"),
# hjustvar = c(0,0,1,1), vjustvar = c(0,1,0,1)) #original placement in each corner
hjustvar = c(-.5, #shifts bottom left 'Text' to the right; make more negative to move it further right
-.5, #shifts top right 'tExt' to the right; make more negative to move it further right
1.5, #shifts bottom right 'teXt' to the left; make more positive to move it further left
1.5), #shifts top right 'texT' to the left; make more positive to move it further left
vjustvar = c(-1, #shifts bottom left 'Text' upward; make more negative to move it further up
2, #shifts top right 'tExt' downward; make more positive to move it further down
-1, #shifts bottom right 'teXt' upward; make more negative to move it further up
2) #shifts top right 'texT' downward; make more positive to move it further down
)
df1 <- data.frame(x1 = sample(c(-5:5), size = 100, replace = TRUE), y1 = sample(c(-5:5), size = 100, replace = TRUE))
ggplot(df1, aes(x1, y1)) + geom_point() +
xlim(-6, 6) + ylim(-6, 6) +
geom_text(data = annotations1, aes(x = xpos, y = ypos, hjust = hjustvar, vjust = vjustvar, label = annotateText))
调整 hjustvar 和 vjustvar 值会使文本框越来越向内部移动,无论轴的比例如何。
##Example 2
annotations2 <- data.frame(
xpos = c(-Inf, -Inf, Inf, Inf), ypos = c(-Inf, Inf, -Inf, Inf),
annotateText = c("Text", "tExt", "teXt", "texT"),
hjustvar = c(-2, -2, 3, 3),
vjustvar = c(-4, 5, -4, 5))
df2 <- data.frame(x2 = rnorm(100), y2 = rnorm(100))
ggplot(df2, aes(x2, y2)) + geom_point() +
geom_text(data = annotations2, aes(x = xpos, y = ypos, hjust = hjustvar, vjust = vjustvar, label = annotateText))