2011-08-23 2 views
4


Я собираюсь построить соотношение шансов с R/ggplot2, и я хочу добавить две стрелки снизу или рядом с меткой оси X. Один из них указывает налево, один указывает направо, демонстрируя отрицательное влияние. Я пробовал много вещей, таких как geom_path, geom_line, без больших успехов. Это мой код:R & ggplot2: Как получить стрелки под меткой оси?

forest <- function(d, xlab="Odds Ratio", ylab="Influencing variables"){ 
require(ggplot2) 
p <- ggplot(d, aes(x=ordered(x, levels=rev(x)), y=y, ymin=ylo, ymax=yhi)) + 
geom_pointrange() + 
geom_segment(aes(x = 0, xend = 0, y= 1, yend= 2)) + 
coord_flip() + 
geom_hline(aes(yintercept=1), lty=2) + 
ylab(xlab) + 
xlab(ylab) + 
scale_y_log10() 
return(p) 
} 
##Test Data 
data <- data.frame(x = c("A","B","C","D","E","F","G","H","I"), 
       y = c(1.782,0.136,0.978,0.645,0.518,1.474,0.855,0.673,0.369)) 
data <- transform(data, ylo = (0.719,0.046,0.945,0.295,0.188,0.577,0.407,0.310,0.145), 
     yhi = c(4.420,0.398,1.012,1.411,1.424,3.768,1.798,1.460,0.940)) 
forest(data) 

Добавление линии, как geom_line (АЕС (х = 1), стрелка = стрелка (длина = единица (0,15, "см")), цвет = "черный", размер = 1) содержит несколько стрелок, но они сталкиваются с моими исходными данными.
Заранее благодарен за ваше решение, помощь или подсказку!
Марк

ответ

2

Я делаю немного гадать о том, что вы хотите, точно, так как я не уверен, что вы пытались с geom_segment, была ли часть данных, или попытка создать стрелку , Но вы можете создать на geom_segment, чтобы получить что-то вроде того, что вы описали:

#Your test data, with a small typo repaired 
dd <- data.frame(x = c("A","B","C","D","E","F","G","H","I"), 
       y = c(1.782,0.136,0.978,0.645,0.518,1.474,0.855,0.673,0.369)) 
dd <- transform(dd, ylo = c(0.719,0.046,0.945,0.295,0.188,0.577,0.407,0.310,0.145), 
     yhi = c(4.420,0.398,1.012,1.411,1.424,3.768,1.798,1.460,0.940)) 

#Create a separate data frame for the arrow labels 
arrowLab <- data.frame(lab = c("Increasing","Decreasing"), 
         x = c(0.15,0.15),y = c(10^0.25,10^(-0.25))) 

ggplot(data = dd, aes(x=ordered(x, levels=rev(x)), y=y)) + 
     geom_pointrange(aes(ymin=ylo, ymax=yhi)) + 
     geom_segment(aes(x = 0, xend = 0, y= 1, yend= 2), 
         arrow=arrow(length=unit(0.2,"cm"))) + 
     geom_segment(aes(x = 0, xend = 0, y= 1, yend= 10^(-0.25)), 
         arrow=arrow(length=unit(0.2,"cm"))) + 
     geom_text(data = arrowLab,aes(x=x,y=y,label = lab),size = 3) + 
     coord_flip() + 
     geom_hline(aes(yintercept=1), lty=2) + 
     scale_y_log10() 

enter image description here

Обратите внимание, что я жестко закодированное большую часть позиционирования, так что вы, вероятно, хотите, чтобы возиться с этими значениями, чтобы получить что вы хотите, или вы можете попытаться выбрать их программно на основе ваших данных.

+0

Спасибо за вашу помощь! Это делает меня большим шагом ближе к тому, что мне нужно. Мое намерение состояло в том, чтобы нарисовать эти две стрелки под «y». Но, возможно, этого достаточно. – Marc

+0

@Marc - Рисование за пределами области печати технически возможно, но сложное, требуя, чтобы вы возились с пакетом «сетка» и видовыми экранами. Я часто говорю людям, что для необычных пользовательских аннотаций, таких как это, часто быстрее/проще просто изменять изображение после факта в редакторе изображений, например Illustrator, или что-то в этом роде. – joran

5

Это довольно старый пост, но я подумал, что поделюсь другим вариантом для тех, кто наткнулся на это.

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

p1 <- qplot(x = 0:12, y = 0:12, geom = "blank") 
p1 <- p1 + ylab(expression(symbol('\256'))) 
p1 <- p1 + xlab(expression(symbol('\256'))) 
p1 <- p1 + theme(axis.title.y = element_text(size = 30)) 
p1 <- p1 + theme(axis.title.x = element_text(size = 30)) 

p1 

enter image description here

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

По умолчанию функция symbol() принимает Adobe Symbol коды, которые Контуры в данном документе: http://goo.gl/vRzpJU

Если вы хотите добавить текст к меткам (просто добавив к выражению, вероятно, сделать его слишком большим), следующее должно вам начать:

grid.text(label="X", x = 0.645, y = 0.02) 
grid.text(label="Y", x = 0.1, y = 0.5, rot=90) 
grid.gedit("GRID.text", gp=gpar(fontsize=15)) 
3

Это можно легко сделать с помощью математической аннотацию в R expression(x <-> y). Таблицу доступных опций можно найти here. expression также позволяет использовать латексные символы.

p1 <- qplot(x = 1:10, y = 1:10, geom = "blank") 
p1 <- p1 + xlab(expression(decreasing %<->% increasing)) 
p1 <- p1 + ylab(expression(down %->% up)) 
p1 <- p1 + ggtitle(expression("Darcy's law" %->% q == -k*frac(Delta*h,Delta*l))) 
p1 <- p1 + theme_bw(base_size=14) 

Including arrows in plot labels

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