不使用密度图在ggplot2/GGally中绘制散点矩阵

5
我使用以下代码用ggplot2扩展GGally制作了散点矩阵:
  ggscatmat(dat2, columns = 2:6, color="car", alpha=0.8) +
  ggtitle("Korrelation") + 
  theme(axis.text.x = element_text(angle=-40, vjust=1, hjust=0, size=10))

现在我的问题是,在这种情况下,我不需要密度线图或相关系数,我只想要矩阵中的散点图。有没有一种方法可以“删除”其他方面?我在文档中找不到任何信息。 请原谅我的糟糕英语,并感谢任何建议或帮助!

Scattermatrix with ggscatmat {GGally}

编辑:我找到了一个使用ggpairs的尚不完美的解决方案:

ggpairs(dat2, columns = 2:6, mapping= aes(color=car), 
        upper = "blank",diag = "blank") +
  theme(axis.text.x = element_text(angle=-40, vjust=1, hjust=0, size=10))

现在没有传说了,而是出现了两个标签,看起来好像图表还没有完全加载:输入图像描述

如果p是你的ggscatmat,你可以通过操作gtable来删除图表的特定部分:例如 g = ggplotGrob(p); g$grobs[c(10, 14)] <- NULL; g$layout <- g$layout[-c(10, 14),]; grid::grid.newpage(); grid::grid.draw(g) - user20650
这很好!但我怎么知道哪部分在哪个向量中?例如,c(10,14)似乎是第一列的第三个散点图,那么为什么是10和14?我能同时删除多个部分吗?对我来说gtable是新的。 - Marie-Louise
https://dev59.com/Hl4c5IYBdhLWcg3wAWPv#29322578 展示了一种在ggpairs中去除额外标签的方法。 - user20650
2个回答

6

你可以通过操作gtable手动删除部分绘图。

 removePanels <- function(plot) {

         g <-  ggplotGrob(plot)

         # get panels to remove: upper + diagonal
         ids <- grep("panel", g$layout$name)
         cols <- sqrt(diff(range(ids)) +1)
         remove <- matrix(ids, ncol=cols)
         remove <- remove[upper.tri(remove, diag=TRUE)]

         # remove certain axis
         yax <- grep("axis-l", g$layout$name)[1] # first
         xax <- tail(grep("axis-b", g$layout$name), 1) #last

         # remove cetain strips
        ystrip <- grep("strip-right", g$layout$name)[1]
        xstrip <- tail(grep("strip-top", g$layout$name), 1)

        # remove grobs
        g$grobs[c(remove, xax, yax, ystrip, xstrip)] <- NULL
        g$layout <- g$layout[-c(remove, xax, yax, ystrip, xstrip),]
        g
      }

# draw
library(GGally)
library(ggplot2)
library(grid)

p <- ggscatmat(iris, columns = 1:4, color="Species", alpha=0.8) +
          theme(axis.text.x = element_text(angle=-40, vjust=1, hjust=0, size=10))

grid.newpage()      
grid.draw(removePanels(p))

1
这真是太完美了!能否也删除掉那两个多余的标签呢? - Marie-Louise
好的。你是指删除带标签的空白处吗?你想做什么?您是否只想删除标签但保留灰色框? - user20650
1
我猜只是把灰色标签框推近图表不可能实现,对吧?虽然这样做会很好,但我已经对结果非常满意了。非常感谢你! - Marie-Louise
非常欢迎。嗯,我不确定 - 可能需要真正深入了解gtable(我对此相当差劲)。一种天真的方法是这样的,但看起来相当糟糕。g <- removePanels(p); idx <- grep("strip-right", g$layout$name); g$layout[idx, c("l", "r")] <- g$layout[idx, c("l", "r")] - 1; idx <- grep("strip-top", g$layout$name); g$layout[idx, c("t", "b")] <- g$layout[idx, c("t", "b")] + 1 - user20650
如果你很菜,那我算什么 :D 非常感谢您的所有帮助!我也看了您对ggpairs的标签删除解决方案,并非常喜欢。我还会在那篇帖子上发一个最后的问题 :) - Marie-Louise

3

根据官方文档,您可以将ggpairs的一个元素设置为空。在您的情况下,您需要将diag的值更改为diag = "blank",如下面的示例所示。

示例

mtcars数据为例,您可以执行以下操作:

data("mtcars")
require(GGally)
ggpairs(data = mtcars[3:5], diag = "blank")

结果

这段代码将会生成一个没有对角线图的期望图表: 无对角线


1
此外,还添加 upper = "blank" 只会留下散点图。 - erc
@beetroot没错,因为upperlower都是列表;值得一提的是,当我们传递自定义函数到面板中以获得整齐格式的系数或自定义注释时,可以轻松地实现其他高级操作。我经常使用pairs来处理自定义请求,例如标记某些值的系数。 - Konrad
是否有一种方法可以使用ggscatmat而不是ggpairs来完成相同的操作?upper="blank"或upper=NULL对于ggscatmat不起作用。正如我在看到你的答案之前刚刚编辑我的问题,我现在有两个多余的标签。 - Marie-Louise

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接