2011-08-23 78 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(AES(X = 1),箭頭=箭頭(長度=部(0.15, 「CM」)),顏色= 「黑」,大小= 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 - 在繪圖區域之外繪製東西在技術上是可行的,但是很複雜,要求你亂用'grid'包和視口。我經常告訴人們,對於像這樣的不尋常的自定義註釋,在像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符號代碼: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)使用數學註解來完成。可以找到可用選項表hereexpression也允許乳膠像數學符號。

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