R:使用ggplot2的散点图矩阵,主题因面板而异

gos*_*sia 3 r ggplot2

我想使用ggplot2创建Scatter Plot Matrix.部分我应对了我的问题.我设法使用ggplot2创建三部分图:下三角 - Scatterplot,对角变量名和上三角 - 相关系数(R ^ 2).下面我给出了我的数据+代码生成我的图表.我的数据:

f = 
C   xval    V   yval    corr    V1
1   1622    1   1622    1       2ng
1   1622    2   1639    0.997   2ng
1   1622    3   1584    0.992   2ng
1   1622    4   1549    0.99    2ng
1   1622    5   1541    0.993   2ng
1   1622    6   1543    0.994   2ng
1   1622    7   1530    0.988   2ng
2   1639    1   1622    0.997   5ng
2   1639    2   1639    1       5ng
2   1639    3   1584    0.997   5ng
2   1639    4   1549    0.997   5ng
2   1639    5   1541    0.998   5ng
2   1639    6   1543    0.998   5ng
2   1639    7   1530    0.995   5ng
3   1584    1   1622    0.992   10ng
3   1584    2   1639    0.997   10ng
3   1584    3   1584    1       10ng
3   1584    4   1549    0.997   10ng
3   1584    5   1541    0.995   10ng
3   1584    6   1543    0.999   10ng
3   1584    7   1530    0.999   10ng
4   1549    1   1622    0.99    15ng
4   1549    2   1639    0.997   15ng
4   1549    3   1584    0.997   15ng 
4   1549    4   1549    1       15ng
4   1549    5   1541    0.998   15ng
4   1549    6   1543    0.998   15ng
4   1549    7   1530    0.998   15ng
5   1541    1   1622    0.993   30ng
5   1541    2   1639    0.998   30ng
5   1541    3   1584    0.995   30ng
5   1541    4   1549    0.998   30ng
5   1541    5   1541    1       30ng
5   1541    6   1543    0.998   30ng
5   1541    7   1530    0.995   30ng
6   1543    1   1622    0.994   60ng
6   1543    2   1639    0.998   60ng
6   1543    3   1584    0.999   60ng
6   1543    4   1549    0.998   60ng
6   1543    5   1541    0.998   60ng
6   1543    6   1543    1       60ng
6   1543    7   1530    0.998   60ng
7   1530    1   1622    0.988   100ng
7   1530    2   1639    0.995   100ng
7   1530    3   1584    0.999   100ng
7   1530    4   1549    0.998   100ng
7   1530    5   1541    0.995   100ng
7   1530    6   1543    0.998   100ng
7   1530    7   1530    1       100ng
Run Code Online (Sandbox Code Playgroud)

和代码:

g <- ggplot(data = f, aes(x=xval, y=yval))+ 
  geom_point(data = f[(xtfrm(f$C)<xtfrm(f$V)),], colour = "darkblue", size = 1.5)+
  geom_smooth(data = f[(xtfrm(f$C)<xtfrm(f$V)),], aes(colour = "red"), method="lm", size = 0.1)+
  geom_text(data = f[(xtfrm(f$C)==xtfrm(f$V)),], aes(x = 4000, y = 4000, label = paste(V1)), size = 10, colour="red")+
  geom_tile(aes(fill=corr))+
  geom_text(data = f[(xtfrm(f$C)>xtfrm(f$V)), ], aes(x = 4000, y = 4000, label = corr), size = 10)+
  coord_cartesian(xlim=c(0,8000), ylim=c(0,8000))+
  facet_grid(V~C, space = "fixed") + 
  theme(panel.grid.major = element_blank(), strip.background = element_blank(), strip.text.y = element_blank(), strip.text.x = element_blank(), legend.position = "none")

g
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述 但是,我遇到了改善图形外观的问题.我想用不同的背景颜色分离图形的一部分,例如:散射的白色背景,变量名称的灰色和相关系数的蓝色.有谁知道怎么做?是否可以或者我必须单独创建图的每个部分?

eip*_*i10 6

一种方法是分别创建每个图,然后将它们放在一起.这允许您为每个绘图独立设置所有绘图元素,包括主题元素,如背景填充颜色.

下面的函数mapply用于为V和的每个组合创建单独的绘图C,并使用if语句为每个绘图指定所需的背景颜色.

library(gridExtra)

p.list = mapply(FUN=function(v,c) {

    fvc = f[f$V==v & f$C==c, ]

    g <- ggplot(data=fvc, aes(x=xval, y=yval))+ 
      coord_cartesian(xlim=c(0,8000), ylim=c(0,8000))+
      theme(axis.title=element_blank(),
            axis.text=element_text(size=8))

    if (c == v) {
      g = g + geom_text(aes(x = 4000, y = 4000, label=V1),
                        size = 6, colour="red")
    }

    if (c < v) {
      g = g + geom_text(aes(x = 4000, y = 4000, label=corr), size = 6) +
        theme(panel.background=element_rect(fill=hcl(180,100,60, alpha=0.3)))
    }

    if (c > v) {
      g = g + geom_point(colour = "darkblue", size = 1.5) +
              geom_smooth(aes(colour = "red"), method="lm", size = 0.1) +
        theme(panel.background=element_blank(),
              panel.grid.major=element_line(colour="grey80", size=0.3))
    }

    if(v != 1) {
      g = g + theme(axis.text.y=element_blank(),
                    axis.ticks.y=element_blank())
    }

    if(c != max(f$C)) {
      g = g + theme(axis.text.x=element_blank(),
                    axis.ticks.x=element_blank())
    }

    return(g) }, 
    expand.grid(V=unique(f$V), C=unique(f$C))[[1]], 
    expand.grid(V=unique(f$V), C=unique(f$C))[[2]], SIMPLIFY=FALSE)
Run Code Online (Sandbox Code Playgroud)

现在将所有图表一起布局并添加x轴和y轴标签:

grid.arrange(
  arrangeGrob(
    arrangeGrob(textGrob("Y vals", rot=90),
                do.call(arrangeGrob, c(p.list, ncol=7)), widths=c(0.05,0.95)),
    textGrob("X vals"), heights=c(0.95,0.05)))
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

正如您在上图中所看到的,还有一个问题:由于轴标签,第一列和最后一行中的面板的绘图区域较小.这个SO答案显示了如何均衡绘图区域的大小,但您必须分别列出每个绘图对象.

幸运的是,我们不必滚动我们自己的函数来均衡大块图形中所有绘图区域的大小,因为plot_gridcowplot包中可以做到这一点.但是,我认为每个图表之间的边距在运行后太大了plot_grid.您可以通过在创建图形时更改绘图边距来调整此值.为此,您可以return在绘图函数的行中调整绘图边距,如下所示:

return(g + theme(plot.margin=unit(c(0,-0.15,0,-0.15), "lines"))) },
Run Code Online (Sandbox Code Playgroud)

然后绘图使用plot_grid:

library(cowplot)

grid.arrange(
  arrangeGrob(
    arrangeGrob(textGrob("Y vals", rot=90),
                do.call(plot_grid, c(p.list, align="hv")), widths=c(0.05,0.95)),
    textGrob("X vals"), heights=c(0.95,0.05)))
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述