在facet_wrap的某些面板上使用geom_rect

10

我正在尝试在我的facet_wrap图的前三个面板上获得一个有阴影的矩形。但是,当我使用geom_rect时,它会在每个面板上都生成矩形。有没有办法只在前三个面板上选择性地获取矩形?

以下是一些代码

dfTemp = data.frame(value = rnorm(100*4), variable = sort(rep(1:4, 100)),
                    date = rep(seq.Date(
                      from = as.Date('2011-01-01', format = '%Y-%m-%d'),
                      length.out = 100,
                      by = 'day'), 4))

ggplot(dfTemp) +
  geom_rect(aes(xmin = as.Date('2011-02-01', format = '%Y-%m-%d'),
                xmax = as.Date('2011-03-01', format = '%Y-%m-%d'),
                ymin = -Inf,
                ymax = Inf), alpha = 0.2, fill = 'grey') +
  geom_line(aes(x = date, y = value, group = variable, color = factor(variable))) +
  facet_wrap(~variable , scale = 'free', ncol = 1) 

更新1:

我已更新我的代码为

dfTemp = data.frame(value = rnorm(100*4), variable = sort(rep(1:4, 100)),
                    date = rep(seq.Date(
                      from = as.Date('2011-01-01', format = '%Y-%m-%d'),
                      length.out = 100,
                      by = 'day'), 4))

ggplot(dfTemp) +
  geom_rect(data = dfTemp[dfTemp$variable %in% c(2, 3),],
            aes(xmin = as.Date('2011-02-01', format = '%Y-%m-%d'),
                xmax = as.Date('2011-03-01', format = '%Y-%m-%d'),
                ymin = -Inf,
                ymax = Inf), alpha = 0.2, fill = 'grey') +
  geom_line(aes(x = date, y = value, group = variable, color = factor(variable))) +
  facet_wrap(~variable , scale = 'free', ncol = 1) 

注意,我现在正在对传递给geom_rect的数据进行子集处理。但这会导致以下警告:

Warning message: In [<-.factor(*tmp*, rng, value = c(1L, 1L, 1L, 1L, 1L, 1L, : invalid factor level, NA generated

这是什么意思?


我在我的回答中添加了一个更新,应该可以澄清为什么您甚至不需要对数据进行子集操作,因为您从数据框中想要的唯一数据是“variable”的值,而没有其他内容。 - BrodieG
2个回答

9
这里提供了一种解决方案,它通过创建一个新的数据框架来利用中的循环功能为中的每个值生成矩形坐标。
ggplot(dfTemp) +
  geom_rect(
    data=data.frame(variable=factor(1:3)), 
    aes(xmin=as.Date('2011-02-01'), xmax=as.Date('2011-03-01'), ymin=-Inf, ymax=Inf), 
    alpha = 0.5, fill = 'grey') +
  geom_line(aes(x = date, y = value, group = variable, color = factor(variable))) +
  facet_wrap(~variable , scale = 'free', ncol = 2)

enter image description here


你可能想把你的代码放在代码块中,对吧? - jlhoward
@jlhoward,我确实想这样做,但显然如果您有项目符号列表,后跟代码块而没有中间文本,则代码块不会呈现。我不得不发布并离开。 - BrodieG
你说服了我。谢谢。 - tchakravarty

7
这可以用非常简单的方式实现:
library(ggplot2)
library(plyr)      # for .(...)
ggplot(dfTemp) +
  geom_rect(subset= .(variable<4),aes(xmin = as.Date('2011-02-01', format = '%Y-%m-%d'),
                xmax = as.Date('2011-03-01', format = '%Y-%m-%d'),
                ymin = -Inf,
                ymax = Inf), alpha = 0.2, fill = 'grey') +
  geom_line(aes(x = date, y = value, group = variable, color = factor(variable))) +
  facet_wrap(~variable , scale = 'free', ncol = 1) 

您原始代码的唯一区别是在调用geom_rect(...)时添加了 subset=.(variable<4)


哈德利的邪恶天才。谢谢 :) - tchakravarty
1
@fgnu,虽然这很好,但请注意透明度不起作用。这是因为您正在绘制矩形,每个数据点都会绘制多次,因此它们会累加到无法透视的点。如果您以这种方式执行,则必须进行子集并确保每个变量值少于4个矩形。 - BrodieG
@BrodieG 谢谢你的回复。实际上,我更喜欢我的解决方案,它是明确的子集。只是很惊讶地看到plyr语法在ggplot2中如此无缝地工作。 - tchakravarty
@fgnu,我认为你的方法在透明度方面存在相同的问题。你不仅希望变量中的值不是4,还希望每个组只保留一行,否则你会得到相同的矩形,而每个组中的行数越多,重叠的矩形就越多(结果就没有透明度)。 - BrodieG
JL,@BrodieG 说得有道理。虽然您的解决方案更整洁,但从可视化角度来看,透明度很重要。 - tchakravarty

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接