将文本框添加到 ggplot2 中的多面体包裹布局
Add textbox to facet wrapped layout in ggplot2
我知道有人可以注释由 ggplot2 创建的图,甚至可以组合大小视口,如 ggplot2-book 中所述。但是,这些似乎只适用于实际的绘图区域,而不适用于 "final plot".
例如我有这样一个情节:
这里我们看到十个面板显示应用于二项式数据集的线性回归平滑器,但这不是重点。现在我想要一个摘要(存储在数据框中),以图表右下角的文本形式出现,例如...
我没有找到任何接近的例子。
非常感谢任何提示、帮助或评论!
从 ggplot2 2.2 开始,我改用了标题选项。您可能想尝试一下。
library(tidyverse)
ggplot(data = mtcars,
mapping = aes(y=mpg, x=wt)) +
geom_point() +
facet_wrap(c("gear", "cyl"), labeller = "label_both") +
labs(title = "mtcars analysis",
subtitle = "This is a subtitle \n",
caption = "\n Note: This analysis compares the number of gears and cylinders",
x = "weight", y = "mpg")
这就是你会得到的:
希望对你有帮助。
游戏已经很晚了,但我还没有看到任何扩展到多个空面空间的解决方案,所以这里开始。
步骤 0。示例 ggplot 有 2 个未填充的小平面,使用内置的钻石数据集:
library(ggplot2)
p <- ggplot(diamonds,
aes(x = carat, y = price)) +
geom_point() +
geom_smooth() +
facet_wrap(~color)
p
步骤 1。使用 ggplotGrob
将绘图转换为 gtable
gp <- ggplotGrob(p)
library(gtable)
# visual check of gp's layout (in this case, it has 21 rows, 15 columns)
gtable_show_layout(gp)
步骤 2。 (可选)获取要用于文本框的未填充单元格的单元格坐标。如果您更喜欢阅读上面的布局,则可以跳过此部分。在这种情况下,左上角的单元格为 (16, 8),右下角的单元格为 (18, 12)。
# get coordinates of empty panels to be blanked out
empty.area <- gtable_filter(gp, "panel", trim = F)
empty.area <- empty.area$layout[sapply(empty.area$grob,
function(x){class(x)[[1]]=="zeroGrob"}),]
empty.area$t <- empty.area$t - 1 #extend up by 1 cell to cover facet header
empty.area$b <- empty.area$b + 1 #extend down by 1 cell to cover x-axis
> empty.area
t l b r z clip name
6 16 8 18 8 1 on panel-3-2
9 16 12 18 12 1 on panel-3-3
步骤 3。将文本框叠加为表格Grob
library(gridExtra)
gp0 <- gtable_add_grob(x = gp,
grobs = tableGrob("some text",
theme = ttheme_minimal()),
t = min(empty.area$t), #16 in this case
l = min(empty.area$l), #8
b = max(empty.area$b), #18
r = max(empty.area$r), #12
name = "textbox")
grid::grid.draw(gp0)
展示一些变化:
gp1 <- gtable_add_grob(x = gp,
grobs = tableGrob("Simple line of comment that can go on & on for the sake of demonstration. Automatic line wrap not included.",
theme = ttheme_minimal()),
t = min(empty.area$t),
l = min(empty.area$l),
b = max(empty.area$b),
r = max(empty.area$r),
name = "textbox")
grid::grid.draw(gp1)
gp2 <- gtable_add_grob(x = gp,
grobs = tableGrob("Simple line of comment that can go on & on.
Automatic line wrap not included. \nAt least it understands the concept of line breaks.",
theme = ttheme_minimal()),
t = min(empty.area$t),
l = min(empty.area$l),
b = max(empty.area$b),
r = max(empty.area$r),
name = "textbox")
grid::grid.draw(gp2)
gp3 <- gtable_add_grob(x = gp,
grobs = tableGrob(tibble::tribble(~col1, ~col2,
"a.", "This is a line in a table",
"b.", "This is another line in a table"),
rows = NULL,
theme = ttheme_minimal()),
t = min(empty.area$t),
l = min(empty.area$l),
b = max(empty.area$b),
r = max(empty.area$r),
name = "textbox")
grid::grid.draw(gp3)
我知道有人可以注释由 ggplot2 创建的图,甚至可以组合大小视口,如 ggplot2-book 中所述。但是,这些似乎只适用于实际的绘图区域,而不适用于 "final plot".
例如我有这样一个情节:
这里我们看到十个面板显示应用于二项式数据集的线性回归平滑器,但这不是重点。现在我想要一个摘要(存储在数据框中),以图表右下角的文本形式出现,例如...
我没有找到任何接近的例子。 非常感谢任何提示、帮助或评论!
从 ggplot2 2.2 开始,我改用了标题选项。您可能想尝试一下。
library(tidyverse)
ggplot(data = mtcars,
mapping = aes(y=mpg, x=wt)) +
geom_point() +
facet_wrap(c("gear", "cyl"), labeller = "label_both") +
labs(title = "mtcars analysis",
subtitle = "This is a subtitle \n",
caption = "\n Note: This analysis compares the number of gears and cylinders",
x = "weight", y = "mpg")
这就是你会得到的:
希望对你有帮助。
游戏已经很晚了,但我还没有看到任何扩展到多个空面空间的解决方案,所以这里开始。
步骤 0。示例 ggplot 有 2 个未填充的小平面,使用内置的钻石数据集:
library(ggplot2)
p <- ggplot(diamonds,
aes(x = carat, y = price)) +
geom_point() +
geom_smooth() +
facet_wrap(~color)
p
步骤 1。使用 ggplotGrob
gp <- ggplotGrob(p)
library(gtable)
# visual check of gp's layout (in this case, it has 21 rows, 15 columns)
gtable_show_layout(gp)
步骤 2。 (可选)获取要用于文本框的未填充单元格的单元格坐标。如果您更喜欢阅读上面的布局,则可以跳过此部分。在这种情况下,左上角的单元格为 (16, 8),右下角的单元格为 (18, 12)。
# get coordinates of empty panels to be blanked out
empty.area <- gtable_filter(gp, "panel", trim = F)
empty.area <- empty.area$layout[sapply(empty.area$grob,
function(x){class(x)[[1]]=="zeroGrob"}),]
empty.area$t <- empty.area$t - 1 #extend up by 1 cell to cover facet header
empty.area$b <- empty.area$b + 1 #extend down by 1 cell to cover x-axis
> empty.area
t l b r z clip name
6 16 8 18 8 1 on panel-3-2
9 16 12 18 12 1 on panel-3-3
步骤 3。将文本框叠加为表格Grob
library(gridExtra)
gp0 <- gtable_add_grob(x = gp,
grobs = tableGrob("some text",
theme = ttheme_minimal()),
t = min(empty.area$t), #16 in this case
l = min(empty.area$l), #8
b = max(empty.area$b), #18
r = max(empty.area$r), #12
name = "textbox")
grid::grid.draw(gp0)
展示一些变化:
gp1 <- gtable_add_grob(x = gp,
grobs = tableGrob("Simple line of comment that can go on & on for the sake of demonstration. Automatic line wrap not included.",
theme = ttheme_minimal()),
t = min(empty.area$t),
l = min(empty.area$l),
b = max(empty.area$b),
r = max(empty.area$r),
name = "textbox")
grid::grid.draw(gp1)
gp2 <- gtable_add_grob(x = gp,
grobs = tableGrob("Simple line of comment that can go on & on.
Automatic line wrap not included. \nAt least it understands the concept of line breaks.",
theme = ttheme_minimal()),
t = min(empty.area$t),
l = min(empty.area$l),
b = max(empty.area$b),
r = max(empty.area$r),
name = "textbox")
grid::grid.draw(gp2)
gp3 <- gtable_add_grob(x = gp,
grobs = tableGrob(tibble::tribble(~col1, ~col2,
"a.", "This is a line in a table",
"b.", "This is another line in a table"),
rows = NULL,
theme = ttheme_minimal()),
t = min(empty.area$t),
l = min(empty.area$l),
b = max(empty.area$b),
r = max(empty.area$r),
name = "textbox")
grid::grid.draw(gp3)