r - 在R中的cowplot包中对齐2行中的垂直3个图
问题描述
我想从第 1 行对齐垂直绘图并从第 2 行绘图。不管我多么努力,但它并没有让我对齐。
有任何想法吗?
library(dplyr)
library(forcats)
library(ggplot2)
library(cowplot)
city_mpg <- mpg %>%
mutate(class = fct_lump(class, 4, other_level = "other")) %>%
group_by(class) %>%
summarize(
mean_mpg = mean(cty),
count = n()
) %>% mutate(
class = fct_reorder(class, count)
)
p1 <- ggplot(city_mpg, aes(class, count)) +
geom_col() +
ylim(0, 65) +
coord_flip()
p2 <- ggplot(city_mpg, aes(mean_mpg, count)) +
geom_point()
p3 <- ggplot(mtcars, aes(wt, mpg)) +
geom_point()
first <- plot_grid(p1, p2, align = 'h', axis = 'l',rel_widths = c(2,1))
second <- plot_grid(p3)
plot_grid(first, second,ncol = 1, align = 'v', axis = 'l',rel_heights = c(2,1))
解决方案
这里的术语ggplot
是图对齐得很好 - 它是不对齐的面板。“面板”表示 x 和 y 轴之间的区域,“绘图”被认为是面板占据的整个区域 + 轴刻度、轴文本和轴标题。
为什么这很重要?好吧,plot_grid()
对齐所有地块,但不对齐面板。由于p1
y 轴文本比 的 y 轴文本更长p3
,因此面板左侧的区域p1
也更宽。与 的左侧对齐时p1
,p3
表示 的面板在p3
的左侧p1
。
解决这个问题的简单方法是在p3
. 通过使用theme(plot.margin)
,我们可以在 的左侧增加一些空间,p3
使 in 的面板左侧的区域与 in 的p3
区域大致相似p1
。不幸的是,除了反复试验之外,以任何其他方式做到这一点都不是很简单。您必须添加一些边距并再次绘制以查看它是太多还是太少。最后,结果虽然有效。同样,我在右侧添加了一些边距,p3
以使该面板的右侧部分与面板的右侧对齐p2
。
要修复,p3
现在的代码如下所示:
p3 <- ggplot(mtcars, aes(wt, mpg)) +
geom_point() +
theme(plot.margin = margin(l=44, t=0, b=0, r=6, 'pt'))
推荐阅读
- awesome-wm - Awesome-WM:带有 Radical 的上下文菜单的位置
- algorithm - 以编程方式生成“哈希”函数
- bash - 为什么这个脚本可以在 Mac OS 上运行,而不是在使用 Git Bash 的 Windows 上运行?
- javascript - 如何让元素在点击时再次执行某些操作
- c# - 在 C# WebBrowser 中引发 onClick 事件不起作用
- javascript - 如何将自定义 React 事件作为组件道具处理
- java - 使用容器 1 中安装的 Java 在容器 2 中运行 jar
- javascript - 如何从 HTML 输入实时更新 Javascript 变量?
- neo4j - Neo4j 密码:结合聚合、排序和限制
- vba - 如何使多个“for”语句在 VBA 中高效运行