Я хочу раскрасить фон фасетного графика ggplot2 в зависимости от значения, заданного в конкретном столбце. Используя ответы на предыдущие вопросы, которые я уже задавал, я смог собрать воедино то, что мне было нужно. Ответ @ 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)
Реальный -сценарий мира, над которым я работаю, должен быть используется для многих разных групп, содержащих много разных рядов данных, поэтому этот сценарий будет дублироваться много раз с изменением только переменных.
Поэтому важно, чтобы определяемые пользователем -элементы были легко доступны для редактирования, поэтому переменные list_of_names
и list_of_regions
помещаются прямо в начало файла. (Конечно, было бы лучше вообще не менять скрипт, а определить эти списки как внешние файлы или передать их скрипту в качестве аргументов. )Я попытался обобщить решение, используя эти два for
цикла для назначения областей. Я какое-то время возился, пытаясь получить решение, более ориентированное на R -, используя функции apply
, но не смог заставить его работать, поэтому я сдался и остановился на том, что знал.
Однако в моем коде вызов scale_fill_manual
должен быть явно передан переменными для определения цветов заливки, таких как 'europe' = 'blue'
. Эти переменные будут варьироваться в зависимости от данных, которые я обрабатываю, поэтому, имея сценарий в его текущей форме, мне нужно будет вручную редактировать часть сценария ggplot для каждой группы рядов данных.Я знаю, что это займет -много времени, и я сильно подозреваю, что это также может привести к ошибкам.
В. В идеале я хотел бы иметь возможность программно извлекать и определять требуемые значения для вызова scale_fill_manual
из ранее объявленного списка значений (, в данном случае из list_of_regions
), соответствующих ранее объявленному списку значений. цветов, но я не могу придумать способ добиться этого. У тебя есть идеи?