2013-10-18 177 views
38

有没有一种方法可以根据数据框提供的变量填充facet_wrap创建的构面条?ggplot2:facet_wrap基于数据集中变量的条纹颜色

实施例的数据:

MYdata <- data.frame(fruit = rep(c("apple", "orange", "plum", "banana", "pear", "grape")), farm = rep(c(0,1,3,6,9,12), each=6), weight = rnorm(36, 10000, 2500), size=rep(c("small", "large")))

例情节:

p1 = ggplot(data = MYdata, aes(x = farm, y = weight)) + geom_jitter(position = position_jitter(width = 0.3), aes(color = factor(farm)), size = 2.5, alpha = 1) + facet_wrap(~fruit)

我知道如何将条带的背景色彩改变(例如橙色):

p1 + theme(strip.background = element_rect(fill="orange"))

facet_wrap and orange strip color

有没有办法在MYdata转嫁值的变量size到参数fillelement_rect

基本上,而不是所有条的颜色1,我想小条水果(苹果,李子,梨)的条形背景颜色为绿色,大水果(橙色,香蕉,葡萄)的背景颜色为红色。

+0

有ISN尽管如此,在另一个网站上,这是一种简单的方法,[之前已经询问过](https://groups.google.com/forum/#!topic/ggplot2/fNBQrBPPbPM)。 – nograpes

+0

谢谢,nograpes。我看了看,却找不到之前询问过的地方。 – Dalmuti71

+0

如果你得到这个代码的工作,你应该把它作为一个答案。 – nograpes

回答

1

我很想知道该怎么做,这是一个好主意。一个想法是用不同的颜色独立生成每个图表,然后使用诸如多槽或视口之类的东西并排显示 - 这将需要更多的工作。

,如果你想提取的传说,你将需要为这种方法 - 这里是哈德利一些代码,我发现了一段时间后

g_legend<-function(a.gplot){ 
    tmp <- ggplot_gtable(ggplot_build(a.gplot)) 
    leg <- which(sapply(tmp$grobs, function(x) x$name) == "guide-box") 
    legend <- tmp$grobs[[leg]] 
    return(legend)} 

看看它是如何从图表p提取它,然后我将它从图中取出 传说< - g_legend(p) lwidth < - sum(legend $ width)#if你想根据这个定义视口 p < - p + theme(legend.position =“无“)

然后你最终绘制

grid.newpage() 
vp <- viewport(width = 1, height = 1) 
#print(p, vp = vp) 

submain <- viewport(width = 0.9, height = 0.9, x = 0.5, y = 1,just=c("center","top")) 
print(p, vp = submain) 
sublegend <- viewport(width = 0.5, height = 0.2, x = 0.5, y = 0.0,just=c("center","bottom")) 
print(arrangeGrob(legend), vp = sublegend) 

好运

46

随着工作的一点点,你可以与有权grobs虚拟gtable结合您的情节,

enter image description here

d <- data.frame(fruit = rep(c("apple", "orange", "plum", "banana", "pear", "grape")), 
       farm = rep(c(0,1,3,6,9,12), each=6), 
       weight = rnorm(36, 10000, 2500), 
       size=rep(c("small", "large"))) 

p1 = ggplot(data = d, aes(x = farm, y = weight)) + 
    geom_jitter(position = position_jitter(width = 0.3), 
       aes(color = factor(farm)), size = 2.5, alpha = 1) + 
    facet_wrap(~fruit) 

dummy <- ggplot(data = d, aes(x = farm, y = weight))+ facet_wrap(~fruit) + 
    geom_rect(aes(fill=size), xmin=-Inf, xmax=Inf, ymin=-Inf, ymax=Inf) + 
    theme_minimal() 

library(gtable) 

g1 <- ggplotGrob(p1) 
g2 <- ggplotGrob(dummy) 

gtable_select <- function (x, ...) 
{ 
    matches <- c(...) 
    x$layout <- x$layout[matches, , drop = FALSE] 
    x$grobs <- x$grobs[matches] 
    x 
} 

panels <- grepl(pattern="panel", g2$layout$name) 
strips <- grepl(pattern="strip_t", g2$layout$name) 
g2$layout$t[panels] <- g2$layout$t[panels] - 1 
g2$layout$b[panels] <- g2$layout$b[panels] - 1 

new_strips <- gtable_select(g2, panels | strips) 
grid.newpage() 
grid.draw(new_strips) 

gtable_stack <- function(g1, g2){ 
    g1$grobs <- c(g1$grobs, g2$grobs) 
    g1$layout <- transform(g1$layout, z= z-max(z), name="g2") 
    g1$layout <- rbind(g1$layout, g2$layout) 
    g1 
} 
## ideally you'd remove the old strips, for now they're just covered 
new_plot <- gtable_stack(g1, new_strips) 
grid.newpage() 
grid.draw(new_plot) 
+1

这只是嘲笑我的世界!一直试图做这个年龄! –

+0

感谢!任何想法如何包含带状颜色的图例? – jayelm

+0

非常有用,谢谢!这是我正在撰写的一篇论文(并且我在最终将归档的代码中引用了这个答案)。 – lukeholman