Программное задание цветов в масштабе _заливка _ручной вызов ggplot

Я хочу раскрасить фон фасетного графика ggplot2 в зависимости от значения, заданного в конкретном столбце. Используя ответы на предыдущие вопросы, которые я уже задавал, я смог собрать воедино то, что мне было нужно. Ответ @ joran на этот вопрос был особенно полезен, поскольку он иллюстрирует технику создания отдельного фрейма данных для передачи в 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цикла для назначения областей. Я какое-то время возился, пытаясь получить решение, более ориентированное на R -, используя функции apply, но не смог заставить его работать, поэтому я сдался и остановился на том, что знал.

Однако в моем коде вызов scale_fill_manualдолжен быть явно передан переменными для определения цветов заливки, таких как 'europe' = 'blue'. Эти переменные будут варьироваться в зависимости от данных, которые я обрабатываю, поэтому, имея сценарий в его текущей форме, мне нужно будет вручную редактировать часть сценария ggplot для каждой группы рядов данных.Я знаю, что это займет -много времени, и я сильно подозреваю, что это также может привести к ошибкам.

В. В идеале я хотел бы иметь возможность программно извлекать и определять требуемые значения для вызова scale_fill_manualиз ранее объявленного списка значений (, в данном случае из list_of_regions), соответствующих ранее объявленному списку значений. цветов, но я не могу придумать способ добиться этого. У тебя есть идеи?

5
задан Community 23 May 2017 в 12:01
поделиться