【问题标题】:Scattermatrix in ggplot2/GGally without density plotsggplot2/GGally中的散点矩阵没有密度图
【发布时间】:2016-04-20 10:57:31
【问题描述】:

我使用以下代码制作了一个带有 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))

现在我的问题是,在这种情况下,我真的不需要密度线图或相关系数。我只需要矩阵中的散点图。有没有办法“删除”其他方面?我无法在文档中找到任何内容。

请原谅我的英语不好,感谢任何建议或帮助!

编辑:我用 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)
  • 这太棒了!但是我怎么知道哪个部分在哪个向量中?例如,c(10,14) 似乎是第一列中的第三个散点图,那么为什么是 10 和 14?我可以一次删除多个部分吗? gtable 对我来说是新的
  • stackoverflow.com/questions/28427572/… 展示了一种删除 ggpairs 中多余标签的方法

标签: r ggplot2 ggally


【解决方案1】:

您可以通过使用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))

【讨论】:

  • 这简直太完美了!是不是也可以把这两个多余的标签也删掉?
  • 好东西。您是指去除条形标签的空白区域吗?你想干什么?您是否愿意只删除标签但保留灰色框?
  • 我想不可能只将灰色标签框推到离地块更近的一步,是吗?这会很好,但无论如何我对结果感到非常满意。非常非常感谢!
  • 不客气。嗯,我不确定 - 可能需要真正进入 gtable 的东西(我很垃圾)。这是一个幼稚的方法,但看起来相当糟糕。 g &lt;- removePanels(p); idx &lt;- grep("strip-right", g$layout$name); g$layout[idx, c("l", "r")] &lt;- g$layout[idx, c("l", "r")] - 1; idx &lt;- grep("strip-top", g$layout$name); g$layout[idx, c("t", "b")] &lt;- g$layout[idx, c("t", "b")] + 1
  • 如果你是垃圾,那我是什么 :D 非常感谢你的帮助!我也看了你的 ggpairs 标签去除解决方案,非常喜欢。我也会在该帖子中发布最后一个问题:)
【解决方案2】:

official documentation 之后,您可以将ggpairs 的元素设置为空白。在您的情况下,您可能有兴趣更改diag 的值到 diag = "blank" ,如下例所示。

示例

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

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

结果

代码将生成没有对角线图的所需图表:

【讨论】:

  • 另外,加上upper = "blank"只会留下散点图
  • @beetroot 没错,因为upperlower 是列表;值得一提的是,其他花哨的东西可以通过pairs 轻松实现,因为它可以将自定义函数传递给面板以获得格式整齐的系数或自定义注释。我经常使用对来处理自定义请求,例如标记特定值的系数。
  • 有没有办法对 ggscatmat 而不是 ggpairs 做同样的事情? upper="blank" 或 upper=NULL 不适用于它。正如我在看到你的答案前一秒钟在我的问题中编辑的那样,我现在有两个多余的标签
猜你喜欢
  • 2011-04-13
  • 1970-01-01
  • 2014-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-27
相关资源
最近更新 更多