替换 gtable 中 ggplot 的元素:标签和网格线
replacing elements of a ggplot inside a gtable: labels and gridlines
我正在学习用 gtable
操纵 ggplot
objects。 [这是我问的一个相关问题:]
本期是:
- 如何从一个 gtable 中取出各种轴元素并将它们放入另一个 gtable 中以替换现有元素? 尤其是:替换垂直网格线(和相应的刻度线) .
下面是一些代码和数字。
# Data
df <- structure(list(Year = c(1950, 2013, 1950, 2013), Country = structure(c(1L,
1L, 2L, 2L), .Label = c("France", "United States"), class = "factor"),
Category = c("Hourly minimum wage", "Hourly minimum wage",
"Hourly minimum wage", "Hourly minimum wage"), value = c(2.14,
9.43, 3.84, 7.25), variable = c("France (2013 euros)",
"France (2013 euros)", "United States (2013 dollars)", "United States (2013 dollars)"
), Unit = c("2013 euros", "2013 euros", "2013 dollars", "2013 dollars"
)), .Names = c("Year", "Country", "Category", "value", "variable",
"Unit"), row.names = c(NA, 4L), class = "data.frame")
# Plot data with ggplot
library(ggplot2)
p1 <- ggplot(data = df, aes(x = Year, y = value, group = variable, colour = variable, shape = variable)) +
geom_line(size = 2, show_guide = FALSE) +
geom_point(size = 4, show_guide = FALSE) +
theme(panel.grid.major.x = element_line(size = 1, colour = "darkgreen"),
panel.grid.minor.x = element_line(size = 1, colour = "darkgreen", linetype = "dotted")) +
theme(text = element_text(size = 20, colour = "darkgreen")) +
theme(axis.text = element_text(size = 20, colour = "darkgreen"))
这里是 p1:
p2 <- ggplot(data = df, aes(x = Year, y = value, group = variable, colour = variable, shape = variable)) +
geom_line(size = 2, show_guide = FALSE) +
geom_point(size = 4, show_guide = FALSE) +
theme(panel.grid.major.x = element_line(size = 1, colour = "darkred"),
panel.grid.minor.x = element_line(size = 1, colour = "darkred", linetype = "dotted")) +
theme(text = element_text(size = 20, colour = "darkred")) +
theme(axis.text = element_text(size = 20, colour = "darkred"))
这是p2:
# replace the bottom axis of p1 with that of p2
library(gtable)
g1 <- ggplot_gtable(ggplot_build(p1))
g2 <- ggplot_gtable(ggplot_build(p2))
# function to remove selected elements from gtables, keeping widths
gtable_grob_remove <- function (g, what = "guide-box") {
require(gtable)
matches <- c(grepl(pattern = what, g$layout$name))
g$layout <- g$layout[!matches, , drop = FALSE]
g$grobs <- g$grobs[!matches]
return(g)
}
# replace "axis-b"
g <- g1
pos <- c(subset(g$layout, name == "axis-b", se = t:r))
g <- gtable_grob_remove(g, what = "axis-b")
g <- gtable_add_grob(g, g2$grobs[[which(g2$layout$name == "axis-b")]],
pos$t, pos$l, pos$b, pos$r, , name = "axis-b")
# replace "xlab"
pos <- c(subset(g$layout, name == "xlab", se = t:r))
g <- gtable_grob_remove(g, what = "xlab")
g <- gtable_add_grob(g, g2$grobs[[which(g2$layout$name == "xlab")]],
pos$t, pos$l, pos$b, pos$r, , name = "xlab")
grid.newpage()
grid.draw(g)
这里是 p1 和一些 p2 元素:
g1 是绿色的,g2 是红色的,我想要红色底轴标签和垂直网格线来代替绿色的。
我已成功识别轴标签和轴标题,但我仍在寻找垂直网格线(以及轴刻度线和轴水平线!)。我想它们在 panel
中,但如何访问它们并更改它们?
在之前的评论中,baptiste 建议使用 names(ggplotGrob(p2)[["grobs"]][[4]][["children"]])
作为识别不同元素的方法。这个returns:
names(ggplotGrob(p2)[["grobs"]][[4]][["children"]])
[1] "grill.gTree.843" "GRID.polyline.828"
[3] "geom_point.points.830" "panel.border.zeroGrob.831"
但是,我不知道如何从这里获取它。此外,附加的数字,例如.843 随着每个 session 的变化而变化,所以我想找到一种不对这些数字进行硬编码的方法。感谢您的建议!
根据其他答案,考虑这个,
# locate the children
grill1 <- grepl("grill",
names(g1[["grobs"]][[4]][["children"]]))
grill2 <- grepl("grill",
names(g2[["grobs"]][[4]][["children"]]))
# swap the kids, the parents won't notice
g1[["grobs"]][[4]][["children"]][grill1] <-
g2[["grobs"]][[4]][["children"]][grill2]
grid.newpage()
grid.draw(g1)
我正在学习用 gtable
操纵 ggplot
objects。 [这是我问的一个相关问题:
本期是:
- 如何从一个 gtable 中取出各种轴元素并将它们放入另一个 gtable 中以替换现有元素? 尤其是:替换垂直网格线(和相应的刻度线) .
下面是一些代码和数字。
# Data
df <- structure(list(Year = c(1950, 2013, 1950, 2013), Country = structure(c(1L,
1L, 2L, 2L), .Label = c("France", "United States"), class = "factor"),
Category = c("Hourly minimum wage", "Hourly minimum wage",
"Hourly minimum wage", "Hourly minimum wage"), value = c(2.14,
9.43, 3.84, 7.25), variable = c("France (2013 euros)",
"France (2013 euros)", "United States (2013 dollars)", "United States (2013 dollars)"
), Unit = c("2013 euros", "2013 euros", "2013 dollars", "2013 dollars"
)), .Names = c("Year", "Country", "Category", "value", "variable",
"Unit"), row.names = c(NA, 4L), class = "data.frame")
# Plot data with ggplot
library(ggplot2)
p1 <- ggplot(data = df, aes(x = Year, y = value, group = variable, colour = variable, shape = variable)) +
geom_line(size = 2, show_guide = FALSE) +
geom_point(size = 4, show_guide = FALSE) +
theme(panel.grid.major.x = element_line(size = 1, colour = "darkgreen"),
panel.grid.minor.x = element_line(size = 1, colour = "darkgreen", linetype = "dotted")) +
theme(text = element_text(size = 20, colour = "darkgreen")) +
theme(axis.text = element_text(size = 20, colour = "darkgreen"))
这里是 p1:
p2 <- ggplot(data = df, aes(x = Year, y = value, group = variable, colour = variable, shape = variable)) +
geom_line(size = 2, show_guide = FALSE) +
geom_point(size = 4, show_guide = FALSE) +
theme(panel.grid.major.x = element_line(size = 1, colour = "darkred"),
panel.grid.minor.x = element_line(size = 1, colour = "darkred", linetype = "dotted")) +
theme(text = element_text(size = 20, colour = "darkred")) +
theme(axis.text = element_text(size = 20, colour = "darkred"))
这是p2:
# replace the bottom axis of p1 with that of p2
library(gtable)
g1 <- ggplot_gtable(ggplot_build(p1))
g2 <- ggplot_gtable(ggplot_build(p2))
# function to remove selected elements from gtables, keeping widths
gtable_grob_remove <- function (g, what = "guide-box") {
require(gtable)
matches <- c(grepl(pattern = what, g$layout$name))
g$layout <- g$layout[!matches, , drop = FALSE]
g$grobs <- g$grobs[!matches]
return(g)
}
# replace "axis-b"
g <- g1
pos <- c(subset(g$layout, name == "axis-b", se = t:r))
g <- gtable_grob_remove(g, what = "axis-b")
g <- gtable_add_grob(g, g2$grobs[[which(g2$layout$name == "axis-b")]],
pos$t, pos$l, pos$b, pos$r, , name = "axis-b")
# replace "xlab"
pos <- c(subset(g$layout, name == "xlab", se = t:r))
g <- gtable_grob_remove(g, what = "xlab")
g <- gtable_add_grob(g, g2$grobs[[which(g2$layout$name == "xlab")]],
pos$t, pos$l, pos$b, pos$r, , name = "xlab")
grid.newpage()
grid.draw(g)
这里是 p1 和一些 p2 元素:
g1 是绿色的,g2 是红色的,我想要红色底轴标签和垂直网格线来代替绿色的。
我已成功识别轴标签和轴标题,但我仍在寻找垂直网格线(以及轴刻度线和轴水平线!)。我想它们在 panel
中,但如何访问它们并更改它们?
在之前的评论中,baptiste 建议使用 names(ggplotGrob(p2)[["grobs"]][[4]][["children"]])
作为识别不同元素的方法。这个returns:
names(ggplotGrob(p2)[["grobs"]][[4]][["children"]])
[1] "grill.gTree.843" "GRID.polyline.828"
[3] "geom_point.points.830" "panel.border.zeroGrob.831"
但是,我不知道如何从这里获取它。此外,附加的数字,例如.843 随着每个 session 的变化而变化,所以我想找到一种不对这些数字进行硬编码的方法。感谢您的建议!
根据其他答案,考虑这个,
# locate the children
grill1 <- grepl("grill",
names(g1[["grobs"]][[4]][["children"]]))
grill2 <- grepl("grill",
names(g2[["grobs"]][[4]][["children"]]))
# swap the kids, the parents won't notice
g1[["grobs"]][[4]][["children"]][grill1] <-
g2[["grobs"]][[4]][["children"]][grill2]
grid.newpage()
grid.draw(g1)