我有一个数据集,我想从中绘制小的倍数,特别是在2乘2的数组中,如下所示:
mydf <- data.frame(letter = factor(rep(c("A", "B", "C", "D"), each = 20)), x = rnorm(80), y = rnorm(80))
ggplot(mydf, aes(x = x, y = y)) + geom_smooth(method = "lm") + geom_point() + facet_wrap(~ letter, ncol = 2)
但是,我希望每个构面标签都包含一个表达式,例如
expression(paste("A or ", alpha))
我可以通过
使用facet_grid()
来实现这一目标
f_names <- list('A' = expression(paste("A or ", alpha)), 'B' = expression(paste("B or ", beta)), 'C' = expression(paste("C or ", gamma)), 'D' = expression(paste("D or ", delta)))
f_labeller <- function(variable, value){return(f_names[value])}
ggplot(mydf, aes(x = x, y = y)) + geom_smooth(method = "lm") + geom_point() + facet_grid(~ letter, labeller = f_labeller)
但是后来我失去了2比2阵列。如何使用表达式重命名facet_wrap()
构面标签?或者,我如何通过使用facet_grid()
重新创建2×2阵列来解决这个问题,但只能面对单个变量?
(这个问题建立在@ baptiste对this previous question的回答中的括号内。)
谢谢!
答案 0 :(得分:9)
为了做我的要求,首先从@Roland加载这个贴标机功能,首先出现here:
facet_wrap_labeller <- function(gg.plot,labels=NULL) {
#works with R 3.0.1 and ggplot2 0.9.3.1
require(gridExtra)
g <- ggplotGrob(gg.plot)
gg <- g$grobs
strips <- grep("strip_t", names(gg))
for(ii in seq_along(labels)) {
modgrob <- getGrob(gg[[strips[ii]]], "strip.text",
grep=TRUE, global=TRUE)
gg[[strips[ii]]]$children[[modgrob$name]] <- editGrob(modgrob,label=labels[ii])
}
g$grobs <- gg
class(g) = c("arrange", "ggplot",class(g))
g
}
然后保存原始ggplot()
对象:
myplot <- ggplot(mydf, aes(x = x, y = y)) + geom_smooth(method = "lm") + geom_point() + facet_wrap(~ letter, ncol = 2)
然后调用facet_wrap_labeller()
并将表达式标签作为参数提供:
facet_wrap_labeller(myplot, labels = c(expression(paste("A or ", alpha)), expression(beta), expression(gamma), expression(delta)))
表达式现在应显示为facet_wrap()
标签。