我想根据特定列中给出的值为ggplot2 facet图的背景着色.使用我已经问过的先前问题的答案,我能够将我需要的东西拼凑在一起.@joran对这个问题的回答特别有用,因为它说明了创建一个单独的数据框以传递给ggplot的技术.
这一切都很好,给出了如下图所示的输出:

这是我用来生成上图的代码:
# User-defined variables go here
list_of_names <- c('aa','bb','cc','dd','ee','ff')
list_of_regions <- c('europe','north america','europe','asia','asia','japan')
# Libraries
require(ggplot2)
require(reshape)
# Create random data with meaningless column names
set.seed(123)
myrows <- 30
mydf <- data.frame(date = seq(as.Date('2012-01-01'), by = "day", length.out = myrows),
aa = runif(myrows, min=1, max=2),
bb = runif(myrows, min=1, max=2),
cc = runif(myrows, min=1, max=2),
dd = runif(myrows, min=1, max=2),
ee = runif(myrows, min=1, max=2),
ff = runif(myrows, min=1, max=2))
# Transform data frame from wide to long
mydf <- melt(mydf, id = c('date'))
mydf$region <- as.character("unassigned")
# Assign regional label
for (ii in seq_along(mydf$date)) {
for (jj in seq_along(list_of_names)) {
if(as.character(mydf[ii,2]) == list_of_names[jj]) {mydf$region[ii] <- as.character(list_of_regions[jj])}
}
}
# Create data frame to pass to ggplot for facet colours
mysubset <- unique(mydf[,c('variable','region')])
mysubset$value <- median(mydf$value) # a dummy value but one within the range used in the data frame
mysubset$date <- as.Date(mydf$date[1]) # a dummy date within the range used
# ... And plot
p1 <- ggplot(mydf, aes(y = value, x = date, group = variable)) +
geom_rect(data = mysubset, aes(fill = region), xmin = -Inf, xmax = Inf, ymin = -Inf, ymax = Inf, alpha = 0.3) +
scale_fill_manual(values = c("japan" = "red", "north america" = "green", "asia" = "orange", "europe" = "blue")) +
geom_line() +
facet_wrap( ~ variable, ncol = 2)
print (p1)
Run Code Online (Sandbox Code Playgroud)
我正在使用的真实脚本旨在用于包含许多不同数据系列的许多不同组,因此这个脚本将被复制多次,只有变量发生变化.
这使得用户定义的元素可以清晰地进行编辑非常重要,这就是为什么list_of_names和list_of_regions变量放在文件的开头.(当然,这将是最好不要需要更改脚本都而是定义这些列表作为外部文件或将其传递给脚本作为参数.)我试着用这两个概括出解决方案for的循环分配的地区.我试着用一段时间试图获得一个更加以R为中心的解决方案,apply但却无法让它工作,所以我放弃了,坚持了解我所知道的东西.
但是,在我的代码中,scale_fill_manual调用需要显式传递变量来定义填充颜色,例如'europe' = 'blue'.这些变量将根据我正在处理的数据而有所不同,因此对于当前形式的脚本,我需要为每组数据系列手动编辑脚本的ggplot部分.我知道这将是耗时的,我强烈怀疑它也很容易出错.
问:我非常希望能够以编程方式提取并定义所需的值scale_fill_manual从值之前声明的列表调用(在这种情况下从list_of_regions)匹配的颜色先前声明的名单,但我不能想到的实现这一目标的方法.你有什么想法?
这有帮助吗?
cols <- rainbow(nrow(mtcars))
mtcars$car <- rownames(mtcars)
ggplot(mtcars, aes(mpg, disp, colour = car)) + geom_point() +
scale_colour_manual(limits = mtcars$car, values = cols) +
guides(colour = guide_legend(ncol = 3))
Run Code Online (Sandbox Code Playgroud)

| 归档时间: |
|
| 查看次数: |
7454 次 |
| 最近记录: |