2011-08-23 40 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