这个关于使用 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 包提供的其他边缘绘图类型选项的类似问题:直方图、密度。
我建议使用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)