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

标签 r ggplot2

我想使用 ggplot2 创建散点图矩阵。部分地,我解决了我的问题。我设法使用 ggplot2 创建了三部分图:下三角形 - 散点图,对角线 - 变量名称和上三角形 - 相关系数(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

和代码:
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

enter image description here
但是,我在改善图形外观方面遇到了问题。我想用不同的背景颜色分隔图形的一部分,例如:散点的白色背景,变量名称的灰色和相关系数的蓝色。有谁知道怎么做?是否有可能或者我必须分别创建图形的每个部分?

最佳答案

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

下面的函数使用 mapplyVC 的每个组合创建一个单独的绘图,并使用 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)

现在将所有绘图放在一起并添加 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)))

enter image description here

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

幸运的是,我们不必滚动我们自己的函数来均衡大型绘图网格中所有绘图区域的大小,因为 plot_grid 包中的 cowplot 可以做到这一点。但是,我认为运行 plot_grid 后每个图之间的边距太大。您可以通过在创建图形时更改绘图边距来调整此设置。为此,您可以在绘图函数的 return 行中调整绘图边距,如下所示:
return(g + theme(plot.margin=unit(c(0,-0.15,0,-0.15), "lines"))) },

然后使用 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)))

enter image description here

关于R:使用 ggplot2 的散点图矩阵,主题因构面面板而异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35301051/

相关文章:

r - 使用 R 计算字符串矩阵

r - 堆叠条形图中的边框被条形图覆盖

r - 如何在带有 Sweave 的 minipage 中使用 ggplot2 图形?

r - 开罗的 R-3.3.2 问题中的半透明

r - 如何使用dplyr按行求和n个最高值而不 reshape ?

Roxygen 和建议的软件包

r - 展平 ggplot2 中的 alpha channel

r - ggplot2中的构面网格中的相关值

r - R中的录音

r - 如何根据属于另一向量的一个向量合并向量列表?