1

尝试使用ggMarginal显示 2 个图,但这些图未被识别。

我在下面粘贴代码的简化版本:

  • 添加 ggMarginal 元素之前 Patchwork 按预期并排显示 ggplots
  • 使用 ggMarginal 添加边际分布后,Patchwork 似乎不再识别该情节。我收到的错误消息如下:
p1m + p2m
#> Error in p1m + p2m: non-numeric argument to binary operator

这是我正在运行的代码:

library(ggplot2)
library(ggExtra)
library(patchwork)

p1 <- ggplot(mtcars) + 
  geom_point(aes(mpg, disp)) + 
  ggtitle('Plot 1')

p1m <- ggMarginal(p1,
                 type = "density",
                 size = 3)

p2 <- ggplot(mtcars) + 
  geom_point(aes(hp, wt, colour = mpg)) + 
  ggtitle('Plot 3')

p2m <- ggMarginal(p2,
                 type = "density",
                 size = 3)

p1+p2



p1m + p2m
#> Error in p1m + p2m: non-numeric argument to binary operator

非常感谢你的帮助!

reprex 包于 2021-10-09 创建(v2.0.1)

4

2 回答 2

1

不确定是否有一个简单的选项可以patchwork使用 class 的对象ggMarginal

添加边图的另一种选择是使用ggsidepatchwork. 一个缺点ggside是(据我所知)目前它不提供任何选项来设置侧面图的样式,即它将继承主图的样式theme

library(ggplot2)
library(ggside)
#> Registered S3 method overwritten by 'ggside':
#>   method from   
#>   +.gg   ggplot2
library(patchwork)

p1 <- ggplot(mtcars, aes(mpg, disp)) + 
  geom_point() + 
  geom_xsidedensity(aes(y = after_stat(density)), position = "stack") +
  geom_ysidedensity(aes(x = after_stat(density)), position = "stack") +
  ggtitle('Plot 1')  +
  theme(ggside.panel.scale = .5)

p2 <- ggplot(mtcars, aes(hp, wt, colour = mpg)) + 
  geom_point() + 
  geom_xsidedensity(aes(y = after_stat(density)), position = "stack") +
  geom_ysidedensity(aes(x = after_stat(density)), position = "stack") +
  ggtitle('Plot 3') +
  theme(ggside.panel.scale = .5,)

p1 + p2

第二个但繁琐的选择是通过ggplot2也制作边缘图并使用以下方法将所有内容粘合在一起patchwork

p1 <- ggplot(mtcars) + 
  geom_point(aes(mpg, disp)) + 
  ggtitle('Plot 1')

p2 <- ggplot(mtcars) + 
  geom_point(aes(mpg, disp, colour = mpg)) + 
  ggtitle('Plot 3')

p1ma <- ggplot(mtcars) + 
  geom_density(aes(mpg)) + 
  theme_void()

p1mb <- ggplot(mtcars) + 
  geom_density(aes(y = disp)) + 
  theme_void()

wrap_plots(list(p1ma, plot_spacer(), p1ma, plot_spacer(), p1, p1mb, p2, p1mb), 
           widths = c(2, 1, 2, 1), heights = c(1, 2),
           ncol = 4, nrow = 2, byrow = TRUE) &
  theme(legend.position = "bottom")

于 2021-10-09T18:01:54.490 回答
0

您可以将您的边际图包装在patchwork::wrap_elements()

patchwork::wrap_elements(p1m) + patchwork::wrap_elements(p2m)
于 2022-02-13T18:24:02.423 回答