【问题标题】:Moving x or y axis together with tick labels to the middle of a single ggplot (no facets)将 x 或 y 轴与刻度标签一起移动到单个 ggplot 的中间(无刻面)
【发布时间】:2016-12-28 12:01:58
【问题描述】:

我在 Excel 中绘制了以下图表:

但后来我想我会使用 ggplot 让它更漂亮。我已经走到这一步了:

如果你很好奇,数据是基于我的answer here,虽然这并不重要。该图是一个标准的 ggplot2 构造,带有一些美化,x 轴通过中间的粗线是用p + geom_hline(aes(yintercept=0)) 实现的(p 是 ggplot 对象)。

感觉Excel图中的坐标轴配置比较好。它强调了 0 线(当数据是金钱时很重要)并且找到截距要容易得多,因为您不必一直从底部跟踪线。这也是人们在纸或板上绘图时绘制轴的方式。

在ggplot中也可以像这样移动轴吗?我不仅想要这条线,还想要移动刻度标签。如果是,如何?如果不是,是技术原因还是设计原因?如果是有意为之,为什么会做出这样的决定?

【问题讨论】:

  • 您可以使用geom_hlinegeom_textgeom_segment 伪造它。另外,如果我需要 7 亿美元退休,我现在应该放弃。
  • 但是看看它的花费有多快。都已经 70 岁了。退休了。
  • 只写你自己的美元价值适当的主题或看这里。 stackoverflow.com/questions/21026598/…
  • 嗯? “可以在ggplot中像这样移动轴吗”?这到底是什么意思?

标签: r plot ggplot2 axes


【解决方案1】:

只是为了完成 baptiste 的出色回答,相当于移动 y 轴:

shift_axis_x <- function(p, x=0){
      g <- ggplotGrob(p)
      dummy <- data.frame(x=x)
      ax <- g[["grobs"]][g$layout$name == "axis-l"][[1]]
      p + annotation_custom(grid::grobTree(ax, vp = grid::viewport(x=1, width = sum(ax$height))), 
                            xmax=x, xmin=x) +
        geom_vline(aes(xintercept=x), data = dummy) +
        theme(axis.text.y = element_blank(), 
              axis.ticks.y=element_blank())
    }

【讨论】:

    【解决方案2】:

    试试这个,

    shift_axis <- function(p, y=0){
      g <- ggplotGrob(p)
      dummy <- data.frame(y=y)
      ax <- g[["grobs"]][g$layout$name == "axis-b"][[1]]
      p + annotation_custom(grid::grobTree(ax, vp = grid::viewport(y=1, height=sum(ax$height))), 
                            ymax=y, ymin=y) +
        geom_hline(aes(yintercept=y), data = dummy) +
        theme(axis.text.x = element_blank(), 
              axis.ticks.x=element_blank())
    
    }
    
    p <- qplot(1:10, 1:10) + theme_bw() 
    shift_axis(p, 5)
    

    【讨论】:

      【解决方案3】:

      我尝试更改主题的axis.text.x,但只能更改hjust。
      所以我认为你可以删除axis.text.x,然后使用geom_text()添加。
      例如:

      test <- data.frame(x=seq(1,5), y=seq(-1,3))
      ggplot(data=test, aes(x,y)) +
        geom_line() +
        theme(axis.text.x=element_blank(), axis.ticks.x=element_blank()) +
        geom_text(data=data.frame(x=seq(1,5), y=rep(0,5)), label=seq(1,5), vjust=1.5)
      

      也许这些代码很有用。

      【讨论】:

        【解决方案4】:

        正如 alistaire 所说,可以使用 geom_hlinegeom_text 来完成,如下所示。

        df <- data.frame(YearMonth = c(200606,200606,200608,200701,200703,200605),
                     person1 = c('Alice','Bob','Alice','Alice','Bob','Alice'),
                     person2 = c('Bob','Alice','Bob','Bob','Alice','Bob'),
                     Event = c('event1','event2','event3','event3','event2','event4')
        )
        
        df$YM <- as.Date(paste0("01",df$YearMonth), format="%d%Y%m")
        rangeYM <- range(df$YM)
        
        ggplot()+geom_blank(aes(x= rangeYM, y = c(-1,1))) + labs(x = "", y = "") +
        theme(axis.ticks = element_blank()) +
        geom_hline(yintercept = 0, col = 'maroon') +
        scale_x_date(date_labels = '%b-%y', date_breaks = "month", minor_breaks = NULL) +
        scale_y_continuous(minor_breaks = NULL) +
        geom_text(aes(x = df$YM, y = 0, label = paste(format(df$YM, "%b-%y")), vjust = 1.5), colour = "#5B7FA3", size = 3.5, fontface = "bold") 
        

        【讨论】:

          猜你喜欢
          • 2012-03-14
          • 1970-01-01
          • 2018-05-20
          • 2020-12-15
          • 1970-01-01
          • 2021-12-19
          • 1970-01-01
          • 2015-12-18
          • 1970-01-01
          相关资源
          最近更新 更多