是否可以创建ggMarginal图而无需对数据进行分解?

时间:2019-04-11 20:24:20

标签: r ggplot2

我有一个包含一些点及其出现频率的数据框,我想用它们的频率来表示点(球)以表示其大小。但是我也想使用 ggMarginal 来创建边际图。下面的代码在不考虑边沿频率的情况下创建了边沿。

library(ggplot2)
df <- data.frame("x" = 1:5, "y" = c(5,8,8,12,10), "f" = c(4,5,8,8,5))
p <- ggplot(df, aes(x=x, y=y, size=f)) + geom_point() + theme_bw()
ggExtra::ggMarginal(p, data=df, type = "histogram")

enter image description here

我不想使用分类数据创建另一个数据框。但这会导致正确的边际。如下所示:

# disaggregated data
df2 <- df[ rep(1:nrow(df), df$f), c("x", "y") ]
p <- ggplot(df2, aes(x=x, y=y)) + geom_point() + theme_bw()
ggExtra::ggMarginal(p, data=df2, type = "histogram")

enter image description here

但是,即使我尝试同时使用两个数据帧,所产生的边际仍然会出错。

p <- ggplot(df, aes(x=x, y=y, size=f)) + geom_point() + theme_bw()
ggExtra::ggMarginal(p, data=df2, type = "histogram")

enter image description here

  1. 是否可以通过分解数据来创建边际?怎么样?
  2. 如果不可能1.,由于上面的示例均未提供所需的绘图,该怎么办呢?

1 个答案:

答案 0 :(得分:1)

这可以通过cowplot软件包来完成。

library(tidyverse)
library(cowplot)

df <- data.frame("x" = 1:5, 
                 "y" = c(5,8,8,12,10), 
                 "f" = c(4,5,8,8,5))
df2 <- df[rep(1:nrow(df), df$f), c("x", "y") ]

p <- 
  ggplot(df, aes(x=x, y=y, size=f)) + 
  geom_count() + 
  theme_bw()
xhist <- 
  axis_canvas(p, axis = "x") + 
  geom_histogram(data = df2, aes(x = x), color = 'lightgray')
yhist <-
  axis_canvas(p, axis = "y", coord_flip = TRUE) + 
  geom_histogram(data = df2, aes(x = y), color = 'lightgray') +
  coord_flip()
p %>%
  insert_xaxis_grob(xhist, grid::unit(1, "in"), position = "top") %>%
  insert_yaxis_grob(yhist, grid::unit(1, "in"), position = "right") %>%
  ggdraw()

enter image description here