首页 文章

将彩色箭头添加到ggplot2的轴(部分在绘图区域外)

提问于
浏览
5

我想添加一个彩色箭头(轴的全长)来显示向一个方向移动的时间(这可以假设,但是对于这个图,没有数值,所以我希望箭头显示方向) . 我可以使用 geom_segment 绘制它,但是缺少绘图区域之外的部分 .

我看过这篇文章:R & ggplot2: How to get arrows under the axis label?但这个解决方案是轴 Headers 的黑客 . 这篇文章:https://stackoverflow.com/a/10542622/1000343显示文本区域之外的行,但不是彩色箭头 .

MWE

library(ggplot2); library(grid); library(scales)

dat <- data.frame(Time=0:5, y=0:5)

ggplot(dat, aes(x=Time, y=y)) +
    geom_area(alpha=.1) + theme_bw() +
    scale_y_continuous(expand = c(0, 0)) +
    scale_x_continuous(expand = c(0, 0)) +
    theme(panel.grid.major = element_blank(), 
        panel.grid.minor = element_blank(),
          axis.text.x=element_blank(),
          axis.ticks.x=element_blank()
    )

I tried:

ggplot(dat, aes(x=Time, y=y)) +
    geom_area(alpha=.1) + theme_bw() +
    scale_y_continuous(expand = c(0, 0)) +
    scale_x_continuous(expand = c(0, 0)) +
    theme(panel.grid.major = element_blank(), 
        panel.grid.minor = element_blank(),
          axis.text.x=element_blank(),
          axis.ticks.x=element_blank()
    ) +
    geom_segment(aes(x=0, xend = 5 , y=0, yend = 0), size=1.5,
        arrow = arrow(length = unit(0.6,"cm")))

Giving

enter image description here

But I want

enter image description here

2 回答

  • 7

    该问题似乎只是剪辑区域(回答here) . 尝试:

    p1<-ggplot(dat, aes(x=Time, y=y)) +
        geom_area(alpha=.1) + theme_bw() +
        scale_y_continuous(expand = c(0, 0)) +
        scale_x_continuous(expand = c(0, 0)) +
        theme(panel.grid.major = element_blank(), 
            panel.grid.minor = element_blank(),
              axis.text.x=element_blank(),
              axis.ticks.x=element_blank()
        ) +
        geom_segment(aes(x=0, xend = 5 , y=0, yend = 0), size=1.5,
            arrow = arrow(length = unit(0.6,"cm"))) 
    
    gt <- ggplot_gtable(ggplot_build(p1))
    gt$layout$clip[gt$layout$name=="panel"] <- "off"
    grid.draw(gt)
    

    要得到

    enter image description here

  • 8

    你可以定义自己的轴grob,

    library(ggplot2)
    
    element_grob.element_custom <- function(element, ...)  {
      grid::segmentsGrob(0,1,1,1, arrow = arrow())
    }
     ## silly wrapper to fool ggplot2
    axis_custom <- function(...){
      structure(
        list(...), # this ... information is not used, btw
        class = c("element_custom","element_blank", "element") # inheritance test workaround
      ) 
    
    }
    
    ggplot(iris, aes(Sepal.Length, Sepal.Width)) +
      geom_line() +
      theme(axis.line = axis_custom(),
            axis.line.y=element_blank())
    

    enter image description here

相关问题