R & ggplot2: Как получить стрелки под меткой оси? - PullRequest
5 голосов
/ 23 августа 2011


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

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 (aes (x = 1), стрелка = стрелка (длина = единица (0,15, "см")), цвет = "черный", размер= 1) приносит некоторые стрелки, но они сталкиваются с моими исходными данными.
Заранее спасибо за ваше решение, помощь или подсказку!
Марк

Ответы [ 3 ]

7 голосов
/ 10 марта 2016

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

6 голосов
/ 13 ноября 2013

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

У меня есть ситуация, которая действительно требует, чтобы у меня были стрелки за пределами области черчения (и я не хочу задействовать 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))
2 голосов
/ 23 августа 2011

Я немного догадываюсь о том, что вы хотите, именно потому, что я не уверен, что вы пытались сделать с 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

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

...