【问题标题】:R ggplot2 Remove space between legends dual axis plotR ggplot2删除图例双轴图之间的空间
【发布时间】:2015-09-13 06:46:48
【问题描述】:

我有两个图表试图与双 y 轴合并。我很难摆脱我试图合并的两个传说之间的空间。这是我的两个图表:

require(ggplot2)
download.file("https://www.dropbox.com/s/y6qg4432x2l2hbr/data1.csv?dl=1","data1.csv")
download.file("https://www.dropbox.com/s/jv5iuarx1qa3vzf/data2.csv?dl=1","data2.csv")
data1<-read.csv("data1.csv")
data2<-read.csv("data2.csv")

> head(data1)  # https://www.dropbox.com/s/y6qg4432x2l2hbr/data1.csv?dl=1 
  base pos    type    values labels valueme2
1    A   1  mean_r 1.0200473   2771 13.56172
2    A   1 quant_r 0.6450000   2771 13.56172
4    C   1  mean_r 6.1059971    343 56.25043
5    C   1 quant_r 3.5411200    343 56.25043
7    G   1  mean_r 0.9848452     84 13.26626
8    G   1 quant_r 0.5639600     84 13.26626

> head(data2)  # https://www.dropbox.com/s/jv5iuarx1qa3vzf/data2.csv?dl=1
   base pos  type     values labels valueme2
3     A   1 p_val  0.7653560   2771 13.56172
6     C   1 p_val 51.2504280    343 56.25043
9     G   1 p_val  0.3350526     84 13.26626
12    T   1 p_val  2.0327415   2770 13.56881
15    A   2 p_val 51.2504280    343 56.25043
18    C   2 p_val  0.5417566    484 13.27813

prettify <- theme(panel.background = element_rect(fill = NA), 
                            panel.grid.major.y = element_blank(),
                            panel.grid.major.x = element_line(size=.1, color="gray",linetype="dotted"), 
                            panel.grid.minor.y = element_blank(),
                            panel.grid.minor.x = element_line(size=.1, color="gray"))

graphme1 <- ggplot(data1, aes(x = base, y = values, colour = type, group = type)) + 
            geom_line(size=1.3) + facet_wrap( ~ pos, ncol = 7) + 
            scale_color_manual(values=c("#7CAE00", "#00BFC4")) + 
            theme_bw() %+replace% prettify +
            theme(legend.position="bottom")

graphme2 <- ggplot(data2, aes(x = base, y = values, colour = "p_val", group = type)) + 
            geom_text(aes(y=(valueme2 + 0.3),label = labels, size = 1), colour="black",alpha=0.65,show_guide=F) + 
            geom_line(size=1.3) + facet_wrap( ~ pos, ncol = 7) + 
            theme_bw() %+replace% prettify +
            theme(legend.position="bottom")

下面是我如何将两者合并:

      g1 <- ggplot_gtable(ggplot_build(graphme1))
      g2 <- ggplot_gtable(ggplot_build(graphme2))

      pp <- c(subset(g1$layout, grepl("panel",name) , se = t:r))
      g <- gtable_add_grob(g1, g2$grobs[grep("panel",g2$layout$name)], pp$t, pp$l, pp$b, pp$l)

      ia <- which(grepl("axis_l",g2$layout$name) |  grepl("axis-l",g2$layout$name)     )
      ga <- g2$grobs[ia]

      axis_idx <- as.numeric(which(sapply(ga,function(x) !is.null(x$children$axis))))

      for(i in 1:length(axis_idx)){
        ax <- ga[[axis_idx[i]]]$children$axis
        ax$widths <- rev(ax$widths)
        ax$grobs <- rev(ax$grobs)
        ax$grobs[[1]]$x <- ax$grobs[[1]]$x - unit(0.9, "npc") + unit(0.16, "cm")
        g <- gtable_add_cols(g, g2$widths[g2$layout[ia[axis_idx[i]], ]$l], length(g$widths) - 1)
        g <- gtable_add_grob(g, ax, pp$t[axis_idx[i]], length(g$widths) - i, pp$b[axis_idx[i]])
      }
      leg1 <- g1$grobs[[which(g1$layout$name == "guide-box")]]
      leg2 <- g2$grobs[[which(g2$layout$name == "guide-box")]]

      g$grobs[[which(g$layout$name == "guide-box")]] <- gtable:::cbind_gtable(leg1, leg2, "first")
      grid.newpage()
      grid.draw(g)

graphme1

graphme2

合并

在最后一张图片中,您可以看到我试图合并的两个图例之间的差距。如果可能的话,我还想摆脱“p_val”标题并将两个图例组合在一个名称“type”下

【问题讨论】:

  • 你能让你的例子可重现吗?
  • @RomanLuštrik 当然,这是指向 data1 的链接:dropbox.com/s/y6qg4432x2l2hbr/data1.csv?dl=0,这是指向 data2 的链接:dropbox.com/s/jv5iuarx1qa3vzf/data2.csv?dl=0
  • 请在您的帖子中包含所有相关数据。链接到异地资源可能会使其在未来变得不那么有用。
  • 谢谢,我会记住的。我在帖子中添加了 head(data1) 和 head(data2)
  • 查看你的数据,最简单的做法就是rbind(data1, data2),然后进行绘图。

标签: r ggplot2 legend facet-wrap grob


【解决方案1】:

使用两个不同比例的y轴是often not a good idea for visualizing data。在您的示例中,它会让读者认为p_val 几乎等同于mean_r(事实并非如此)。

正如我在 cmets 中所说,最好的办法是将数据合并到一个数据帧中,然后制作你的绘图:

dat12 <- rbind(data1,data2)

ggplot(dat12, aes(x = base, y = values, colour = type, group = type)) + 
  geom_line(size=1) + 
  facet_grid(. ~ pos) + 
  theme_bw() + 
  theme(panel.background = element_rect(fill = NA),
        panel.grid.major.y = element_blank(),
        panel.grid.major.x = element_line(size=.1, color="gray",linetype="dotted"),
        panel.grid.minor.y = element_blank(),
        panel.grid.minor.x = element_line(size=.1, color="gray"),
        legend.position="bottom")

给出:

另一种可能解决您的问题的解决方案是使用带有 x 变量和 y 变量的 facet_grid:

ggplot(dat12, aes(x = base, y = values, color = type, group = type)) + 
  geom_line(size=1) + 
  facet_grid(type ~ pos, scales="free_y") + 
  theme_bw() + 
  theme(panel.background = element_rect(fill = NA),
        panel.grid.major.y = element_blank(),
        panel.grid.major.x = element_line(size=.1, color="gray",linetype="dotted"),
        panel.grid.minor.y = element_blank(),
        panel.grid.minor.x = element_line(size=.1, color="gray"),
        legend.position="bottom")

给出:

【讨论】:

    猜你喜欢
    • 2016-04-11
    • 1970-01-01
    • 2019-11-17
    • 2021-08-10
    • 1970-01-01
    • 1970-01-01
    • 2020-10-16
    • 2014-02-04
    • 1970-01-01
    相关资源
    最近更新 更多