【问题标题】:R & ggplot2: How to get arrows under the axis label?R&ggplot2:如何在轴标签下获取箭头?
【发布时间】:2011-11-01 21:46:48
【问题描述】:


我即将用 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,"cm")), colour="black", size=1) 带来了一些箭头,但它们与我的原始数据相冲突。
提前感谢您的解决方案、帮助或提示!
马克

【问题讨论】:

    标签: r ggplot2 axis


    【解决方案1】:

    这可以使用 R expression(x &lt;-&gt; 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)
    

    【讨论】:

    • 链接已损坏,here 是工作版本(或谷歌“R 中的数学注释”)
    【解决方案2】:

    这是一篇相当老的帖子,但我想我会为任何偶然发现此问题的人分享另一个选择。

    我的情况确实需要我在绘图区域之外有箭头(并且不在乎涉及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  
    

    主题修改不是绝对必要的,但您可能希望至少增加一点箭头的大小。

    默认情况下,symbol() 函数采用此 document 中概述的 Adob​​e 符号代码。

    如果您想在标签中添加一些文本(仅添加到表达式可能会使其太大),以下内容应该可以帮助您开始:

    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】:

      我正在猜测您到底想要什么,因为我不确定您对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() 
      

      请注意,我对大部分定位进行了硬编码,因此您可能希望修改这些值以获得您想要的,或者您可以尝试根据您的数据以编程方式选择它们。

      【讨论】:

      • 感谢您的帮助!这让我离我需要的东西更近了一步。我的意图是在“y”下绘制这两个箭头。但也许这已经足够了。
      • @Marc - 在绘图区域之外绘制东西在技术上是可行的,但很复杂,需要你弄乱grid 包和视口。我经常告诉人们,对于像这样的不寻常的自定义注释,在 Illustrator 等图像编辑器中修改图像通常更快/更容易。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-22
      • 1970-01-01
      • 1970-01-01
      • 2020-07-08
      • 1970-01-01
      • 2012-05-17
      相关资源
      最近更新 更多