gpt4 book ai didi

r - 在 scale_fill_manual ggplot 调用中以编程方式指定颜色

转载 作者:行者123 更新时间:2023-12-04 20:17:43 24 4
gpt4 key购买 nike

我想根据特定列中给定的值为 ggplot2 分面图的背景着色。使用我已经问过的先前问题的答案,我能够将我需要的东西拼凑起来。 @joran 对 this 的回答问题特别有用,因为它说明了创建单独的数据框以传递给 ggplot 的技术。

这一切都很好,输出如下图所示:
facets coloured by region

这是我用来生成上述图的代码:

# 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)

我正在处理的真实世界脚本旨在用于包含许多不同数据系列的许多不同组,因此该脚本将被多次复制,仅更改变量。

这使得让用户定义的元素清晰可访问以进行编辑非常重要,这就是 list_of_names 的原因。和 list_of_regions变量放在文件的开头。 (当然,最好根本不需要更改脚本,而是将这些列表定义为外部文件或将它们作为参数传递给脚本。)我试图通过使用这两个 for 来概括解决方案。循环分配区域。我确实尝试了一段时间,试图使用 apply 获得一个更加以 R 为中心的解决方案功能,但无法让它工作,所以我放弃并坚持我所知道的。

但是,在我的代码中,它是 scale_fill_manual call 需要显式传递变量来定义填充颜色,比如 '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))

enter image description here

关于r - 在 scale_fill_manual ggplot 调用中以编程方式指定颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10267583/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com