2016-12-06 55 views
0

之前,這是一個很好的解決方案使用ggplot像雙軸圖表停止工作

library(ggplot2) 
library(gtable) 
library(grid) 
library(ggthemes) 

# extract gtable 
ggplot_second_axis <- function(p1, p2){ 
    p2 <- p2 + theme() %+replace% 
    theme(panel.background = element_rect(fill = NA)) 

    grid.newpage() 
    g1 <- ggplot_gtable(ggplot_build(p1)) 
    g2 <- ggplot_gtable(ggplot_build(p2)) 

    # overlap the panel of 2nd plot on that of 1st plot 
    pp <- c(subset(g1$layout, name == "panel", se = t:r)) 
    g <- gtable_add_grob(g1, g2$grobs[[which(g2$layout$name == "panel")]], pp$t, pp$l, pp$b, pp$l) 

    # axis tweaks 
    ia <- which(g2$layout$name == "axis-l") 
    ga <- g2$grobs[[ia]] 
    ax <- ga$children[[2]] 
    ax$widths <- rev(ax$widths) 
    ax$grobs <- rev(ax$grobs) 
    ax$grobs[[1]]$x <- ax$grobs[[1]]$x - unit(1, "npc") + unit(0.15, "cm") 
    g <- gtable_add_cols(g, g2$widths[g2$layout[ia, ]$l], length(g$widths) - 1) 
    g <- gtable_add_grob(g, ax, pp$t, length(g$widths) - 1, pp$b) 

    ia2 <- which(g2$layout$name == "ylab") 
    ga2 <- g2$grobs[[ia2]] 
    ga2$rot <- 90 
    g <- gtable_add_cols(g, g2$widths[g2$layout[ia2, ]$l], length(g$widths) - 1) 
    g <- gtable_add_grob(g, ga2, pp$t, length(g$widths) - 1, pp$b) 

    return(g) 
} 

# two plots 
p1 <- ggplot(mtcars, aes(mpg, disp)) + geom_line(colour = "blue") 
p2 <- ggplot(mtcars, aes(mpg, drat)) + geom_line(colour = "red") 
f <- ggplot_second_axis(p1,p2) 
grid.draw(f) 

一切陰謀與雙軸圖表似乎工作確定到現在爲止,但最近我得到以下錯誤:

Error in g2$grobs[[ia2]]: attempt to select less than one element in get1index. 
Changes in system: merged dplyr and data.table into dtplyr. Updated R to 3.3.2 from 3.3.1 

降級不起作用。

+1

考慮降級包版本持續使用了。 –

+0

Roman,請問您是否可以重現錯誤? – dainys

+2

[This answer](http://stackoverflow.com/questions/26917689/how-to-use-facets-with-a-dual-y-axis-ggplot/40746716#40746716)可能會有用。 – Henrik

回答

2

嘗試改變:

IA2 < - 這(G2 $佈局$名稱== 「ylab」)

到:

IA2 < - 這(G2 $佈局$名稱==與最新的ggplot更新爲我工作「ylab-L」)

(...)

+0

救了我!謝謝! –