2016-09-27 93 views
2

我试图产生GGPLOT2轴线换行符(用白色段在轴线的线),我有一些麻烦定制GROB。GGPLOT2 - 在轴线

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

我对其他软件包如plotrix也很熟悉,能够在基础上复制断开的轴,但是我更感兴趣的是要了解为什么我创建的轴连线没有覆盖线。下面是一些示例代码:

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放置在轴线之下,是否有更好的解决方案,以添加自定义grobs使用 enter image description here

我很好奇GGPLOT2。似乎有一个图形放置在绘图窗口中的顺序 - 这可能会如何交替,以便自定义grobs放置在轴线之后?

回答

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)