2015-08-20 2 views
5

У меня есть график рассеяния с горизонтальной и вертикальной линией, на которых изображены значения пороговых значений, и поэтому они делят график на четыре квадранта. Я бы назвал квадранты. Я думаю, что лучший способ сделать это - это число в каждом из четырех углов графика (альтернативные предложения приветствуются!).Позиция ggplot text в каждом углу

Мне удалось поместить текст в угол каждого квадранта, но позиции не идеальны. Я предполагаю, что проблема связана с тем, что масштабирование осей отличается (диапазон значений примерно одинаковый, но ширина моей фигуры примерно в три раза превышает высоту).

В настоящее время я делаю следующий путь. Сначала я создаю график с точками и двумя строками, затем строю его, чтобы получить диапазон двух осей, который я использую, чтобы отрегулировать положение текстов.

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

Добро пожаловать на ТАК! Просьба представить [воспроизводимый пример] (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example) с набором данных и, возможно, изображение вашего текущего вывода, показывающего что не так – scoa

+0

Я бы добавил фотографию, но у меня недостаточно очков репутации, чтобы сделать это. –

ответ

11

Этот пример использует 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(aes(x=xpos,y=ypos,hjust=hjustvar,vjust=vjustvar,label=annotateText)) 

Example of Text Annotations in Corner

Если мы хотим изменить любую из текстовых позиций, мы бы корректировать горизонтальные позиции с 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)) 

Height Adjustment away from Corners

Надеется, что это работает!

+0

Спасибо за ваш ответ! К сожалению, это просто работает частично. Верхние два текста печатаются, нижние - нет. Не должно быть также между 0 и 1, как hjust? Но у меня есть еще один вопрос: Я хотел бы сделать равный (абсолютный) отступ от обеих осей. Как мне это сделать с помощью hjust и vjust? –

+0

hjust positive = left, hjust negative = right. vjust positive = down, vjust negative = up. Размер корректировки зависит от масштаба, который у вас есть с вашими переменными, для фактических данных. Поэтому вам нужно что-то, что подходит. – user2673238

+0

В настоящее время я использую следующие параметры: hjustvar = c (1, 0, 0, 1) vjustvar = c (1, 1, 0, 0) text = c ("1", "2", "3" , «4») 1 (вверху справа) и 2 (вверху слева) напечатаны, 3 и 4 - нет. –

8

При добавлении аннотаций обязательно добавьте новый набор данных или используйте аннотацию, иначе наклейки будут накладываться на несколько ярлыков. Вот минимальное изменение от другого ответа,

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)) 

enter image description here

Смежные вопросы