ggExtra 绘图格式:不同绘图尺寸的相似边缘绘图

Vik*_*ant 2 plot r ggplot2

这个关于使用 ggplot2 + ggExtra 生成的格式化图的问题与任何错误无关。

require(ggplot2)
#> Loading required package: ggplot2
require(ggExtra)
#> Loading required package: ggExtra
p1 <- ggplot(data = mpg,aes(x = cty,y = cty)) + 
  geom_point()+ 
  xlab("City driving (miles/gallon)") +
  ylab("City driving (miles/gallon)")

ggMarginal(p = p1,type= "boxplot")
Run Code Online (Sandbox Code Playgroud)

此图表中的 y 轴边缘图通常与 x 轴边缘图不相似,即 2 个箱线图的宽度不相似。当我更改绘图尺寸(在我的情况下,使用 RStudio)时,这个问题变得更加严重。任何建议如何在使用不同的绘图尺寸(宽度 x 高度)时使 2 个箱线图的宽度相似。

我遇到了 ggExtra 包提供的其他边缘绘图类型选项的类似问题:直方图、密度。

Cla*_*lke 5

我建议使用axis_canvascowplot 包中的函数。(免责声明:我是包的作者。)它需要更多的工作,但它允许您绘制您想要的任何边缘。并且您可以以输出单位(例如英寸)精确指定尺寸。

require(cowplot)

pmain <- ggplot(data = mpg, aes(x = cty, y = hwy)) + 
  geom_point() + 
  xlab("City driving (miles/gallon)") +
  ylab("Highway driving (miles/gallon)")

xbox <- axis_canvas(pmain, axis = "x", coord_flip = TRUE) + 
  geom_boxplot(data = mpg, aes(y = cty, x = 1)) + coord_flip()
ybox <- axis_canvas(pmain, axis = "y") + 
  geom_boxplot(data = mpg, aes(y = hwy, x = 1))

p1 <- insert_xaxis_grob(pmain, xbox, grid::unit(1, "in"), position = "top")
p2 <- insert_yaxis_grob(p1, ybox, grid::unit(1, "in"), position = "right")
ggdraw(p2)
Run Code Online (Sandbox Code Playgroud)

在以下两个具有不同纵横比的图像中查看箱线图如何保持其宽度/高度。(不幸的是,Stackoverflow 重新缩放了图像,因此效果有些模糊,但您可以看到顶部箱线图的高度始终等于一侧的宽度。)

在此处输入图片说明

在此处输入图片说明

第二个优点是,因为您可以将成熟的 ggplot2 用于边缘图,所以您可以绘制任何您想要的东西,例如分组箱线图。

require(cowplot)

pmain <- ggplot(data = mpg, aes(x = cty, y = hwy, color = factor(cyl))) + 
  geom_point() + 
  xlab("City driving (miles/gallon)") +
  ylab("Highway driving (miles/gallon)") +
  theme_minimal()

xbox <- axis_canvas(pmain, axis = "x", coord_flip = TRUE) + 
  geom_boxplot(data = mpg, aes(y = cty, x = factor(cyl), color = factor(cyl))) + 
  scale_x_discrete() + coord_flip()
ybox <- axis_canvas(pmain, axis = "y") + 
  geom_boxplot(data = mpg, aes(y = hwy, x = factor(cyl), color = factor(cyl))) +
  scale_x_discrete()

p1 <- insert_xaxis_grob(pmain, xbox, grid::unit(1, "in"), position = "top")
p2 <- insert_yaxis_grob(p1, ybox, grid::unit(1, "in"), position = "right")
ggdraw(p2)
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明