【问题标题】:ggplot2 - custom grob over axis linesggplot2 - 在轴线上自定义 grob
【发布时间】:2016-11-16 08:59:41
【问题描述】:

我正在尝试在 ggplot2 中生成一个轴线中断(在轴线上方有一个白色段),我遇到了一些麻烦。

使用信息丰富的帖子 annotate-ggplot-with-an-extra-tick-and-label 我能够在给定位置生成自定义 grobs,同时还关闭面板以在绘图区域之外“绘制”。

我也熟悉其他软件包,例如 plotrix,并且能够在基础中复制断轴,但最重要的是我有兴趣了解为什么我正在创建的轴 grobs 不会覆盖线.下面是一些示例代码:

library(ggplot2) # devtools::install_github("hadley/ggplot2")
library(grid)
library(scales)


data("economics_long")
econ <- economics_long
econ$value01 <- (econ$value01/2)
x <- ggplot(econ, aes(date, value01,group=1)) + scale_y_continuous(labels=c(0.0,0.1,0.2,0.3,0.4,0.5,1.0), breaks=c(0.0,0.1,0.2,0.3,0.4,0.5,0.6),limits = c(0,.6),expand = c(0, 0)) +
  geom_smooth(colour="deepskyblue", show.legend = TRUE ) + theme_bw()

theme_white <- theme(panel.background=element_blank(),
                     panel.border=element_rect(color="white"),
                     plot.margin = unit(c(.2, 0, .2, .2), "cm"),
                     panel.grid.major.y=element_blank(),
                     panel.grid.major.x=element_blank(),
                     panel.grid.minor.x=element_blank(),
                     panel.grid.minor.y=element_blank(),
                     axis.title.y = element_blank(),
                     axis.line.x=element_line(color="gray", size=1),
                     axis.line.y=element_line(color="gray", size=1),
                     axis.text.x=element_text(size=12),
                     axis.text.y=element_text(size=12),
                     axis.ticks=element_line(color="gray", size=1),
                     legend.position="none"
)
x <- x + theme_white


gline = linesGrob(y = c(0, 1.5),x = c(-.015, .015),  gp = gpar(col = "black", lwd = 2.5)) 
gline2 = linesGrob(y = c(-0.25, 0.5),x = c(0, 0),  gp = gpar(col = "red", lwd = 5))

p = x + annotation_custom(gline, ymin=.55, ymax=.575, xmin=-Inf, xmax=Inf) + 
  annotation_custom(gline, ymin=.525, ymax=.55, xmin=-Inf, xmax=Inf) +
  annotation_custom(gline2, ymin=.55, ymax=.575, xmin=-Inf, xmax=Inf)

# grobs are placed under the axis lines....

g = ggplotGrob(p)
g$layout$clip[g$layout$name=="panel"] <- "off"
grid.draw(g)

创建此图像:

我很好奇为什么 annotation_custom grobs 放置在轴线下方,以及是否有更好的解决方案来使用 ggplot2 添加自定义 grobs。图形在绘图窗口中的放置顺序似乎是有顺序的 - 如何交替使用,以便将自定义 grobs 放置在轴线之后?

【问题讨论】:

    标签: r ggplot2


    【解决方案1】:

    你很亲密。布局数据框是您是否关闭了剪裁。布局数据框中的另一列给出了绘制各种绘图元素的顺序 - z。第二次绘制绘图面板(包括注释)(在背景之后),然后绘制轴。将绘图面板的 z 值更改为大于轴的 z 值。

    library(ggplot2) # devtools::install_github("hadley/ggplot2")
    library(grid)
    library(scales)
    
    
    data("economics_long")
    econ <- economics_long
    econ$value01 <- (econ$value01/2)
    
    
    x <- ggplot(econ, aes(date, value01,group=1)) + scale_y_continuous(labels=c(0.0,0.1,0.2,0.3,0.4,0.5,1.0), breaks=c(0.0,0.1,0.2,0.3,0.4,0.5,0.6),limits = c(0,.6),expand = c(0, 0)) +
      geom_smooth(colour="deepskyblue", show.legend = TRUE ) + theme_bw()
    
    theme_white <- theme(panel.background=element_blank(),
                         panel.border=element_rect(color="transparent"),
                         plot.margin = unit(c(.2, 0, .2, .2), "cm"),
                         panel.grid.major.y=element_blank(),
                         panel.grid.major.x=element_blank(),
                         panel.grid.minor.x=element_blank(),
                         panel.grid.minor.y=element_blank(),
                         axis.title.y = element_blank(),
                         axis.line.x=element_line(color="gray", size=1),
                         axis.line.y=element_line(color="gray", size=1),
                         axis.text.x=element_text(size=12),
                         axis.text.y=element_text(size=12),
                         axis.ticks=element_line(color="gray", size=1),
                         legend.position="none"
    )
    x <- x + theme_white
    
    
    gline = linesGrob(y = c(0, 1.5),x = c(-.015, .015),  gp = gpar(col = "black", lwd = 2.5)) 
    gline2 = linesGrob(y = c(-0.25, 0.5),x = c(0, 0),  gp = gpar(col = "red", lwd = 5))
    
    p = x + annotation_custom(gline, ymin=.55, ymax=.575, xmin=-Inf, xmax=Inf) + 
      annotation_custom(gline, ymin=.525, ymax=.55, xmin=-Inf, xmax=Inf) +
      annotation_custom(gline2, ymin=.55, ymax=.575, xmin=-Inf, xmax=Inf)
    
    # grobs are placed under the axis lines....
    
    g = ggplotGrob(p)
    g$layout$clip[g$layout$name=="panel"] <- "off"
    
    g$layout  # Note that z for panel is 1.  Change it to something bigger.
    
    g$layout$z[g$layout$name=="panel"] = 17    
    
    grid.newpage()
    grid.draw(g)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-10
      • 1970-01-01
      • 2016-10-06
      相关资源
      最近更新 更多