有条不紊地使用facet_grid更改面板背景?

bro*_*oli 31 r ggplot2

我正在使用ggplot2中的"提示"数据集.如果我做

sp = ggplot(tips,aes(x=total_bill, y = tip/total_bill)) + 
        geom_point(shape=1) + 
        facet_grid(sex ~ day)
Run Code Online (Sandbox Code Playgroud)

情节很好.但我现在想要改变"Fri"下的情节的面板背景.有没有办法做到这一点?

更好的是,我可以通过传递参数来有条件地改变颜色吗?例如,如果超过3个点低于0.1,那么将面板背景(仅适用于该面板)更改为某种颜色,而其他所有颜色保持默认浅灰色?

jor*_*ran 61

ggplot2中做任何事情的一般规则是,

  1. 创建一个数据框,对要绘制的信息进行编码
  2. 将该数据框传递给geom

在这种情况下,由于要更改的图的特定方面,这会变得有点复杂.设计ggplot2的方式是将图表的数据元素(即geom)与非数据元素(即主题)分开,并且情节背景属于"非数据"类别.

总是可以手动修改底层网格对象,但这很繁琐,细节可能会随着ggplot2的不同版本而改变.相反,我们将使用哈德利在这个问题中提到的"黑客" .

#Create a data frame with the faceting variables
# and some dummy data (that will be overwritten)
tp <- unique(tips[,c('sex','day')])
tp$total_bill <- tp$tip <- 1

#Just Fri
ggplot(tips,aes(x=total_bill, y = tip/total_bill)) + 
        geom_rect(data = subset(tp,day == 'Fri'),aes(fill = day),xmin = -Inf,xmax = Inf,
            ymin = -Inf,ymax = Inf,alpha = 0.3) +
        geom_point(shape=1) + 
        facet_grid(sex ~ day) 
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

#Each panel
ggplot(tips,aes(x=total_bill, y = tip/total_bill)) + 
        geom_rect(data = tp,aes(fill = day),xmin = -Inf,xmax = Inf,
            ymin = -Inf,ymax = Inf,alpha = 0.3) +
        geom_point(shape=1) + 
        facet_grid(sex ~ day) 
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

  • 请注意,设置panel.background和上面的geom_rect在geom_raster后面的行为有所不同,因为当栅格后面没有"无"时可以进行优化.当保存为pdf时,geom_rect版本是一个非常大的文件,几乎无法打开大多数pdf查看器! (3认同)