Подтвердить что ты не робот

Как указать столбцы в facet_grid или как изменить метки в facet_wrap

У меня есть большое количество рядов данных, которые я хочу построить с использованием небольших кратных. Комбинация ggplot2 и facet_wrap делает то, что я хочу, как правило, получается небольшой блок размером 6 x 6. Здесь более простая версия:

facet_wrap

Проблема заключается в том, что у меня нет адекватного контроля над ярлыками в гранях. Имена столбцов в кадре данных коротки, и я хочу сохранить их таким образом, но я хочу, чтобы метки в гране были более наглядными. Я могу использовать facet_grid, чтобы я мог использовать функцию labeller, но, похоже, нет простого способа указать количество столбцов, а длинная строка граней просто не работает для этой конкретной задачи. Мне что-то не хватает?

facet_grid

Q. Как изменить метки фасетов при использовании facet_wrap без изменения имен столбцов? В качестве альтернативы, как я могу указать количество столбцов и строк при использовании facet_grid?

Далее приведен код для упрощенного примера. В реальной жизни я имею дело с несколькими группами, каждая из которых содержит десятки рядов данных, каждый из которых часто меняется, поэтому любое решение должно быть автоматизировано, а не полагаться на присвоение вручную значений.

require(ggplot2)
require(reshape)

# Random data with short 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))

# Plot using facet wrap - we want to specify the columns
# and the rows and this works just fine, we have a little block
# of 2 columns and 3 rows

mydf <- melt(mydf, id = c('date'))

p1 <- ggplot(mydf, aes(y = value, x = date, group = variable)) +
    geom_line() +
    facet_wrap( ~ variable, ncol = 2)
print (p1)

# Problem: we want more descriptive labels without changing column names.
# We can change the labels, but doing so requires us to
# switch from facet_wrap to facet_grid
# However, in facet_grid we can't specify the columns and rows...

mf_labeller <- function(var, value){ # lifted bodily from the R Cookbook
    value <- as.character(value)
    if (var=="variable") {
        value[value=="aa"]   <- "A long label"
        value[value=="bb"]   <- "B Partners"
        value[value=="cc"]   <- "CC Inc."
        value[value=="dd"]   <- "DD Company"
        value[value=="ee"]   <- "Eeeeeek!"
        value[value=="ff"]   <- "Final"
    }
    return(value)
}

p2 <- ggplot(mydf, aes(y = value, x = date, group = variable)) +
    geom_line() +
    facet_grid( ~ variable, labeller = mf_labeller)
print (p2)
4b9b3361

Ответ 1

Я не совсем понимаю. Вы уже создали функцию, которая преобразует ваши короткие ярлыки в длинные, описательные метки. Что не так, просто добавив новый столбец и используя facet_wrap в этом столбце?

mydf <- melt(mydf, id = c('date'))
mydf$variableLab <- mf_labeller('variable',mydf$variable)

p1 <- ggplot(mydf, aes(y = value, x = date, group = variable)) +
    geom_line() +
    facet_wrap( ~ variableLab, ncol = 2)
print (p1)

Ответ 2

Чтобы изменить имена ярлыков, просто измените уровни факторов фактора, который вы используете в facet_wrap. Они будут использоваться в facet_wrap на полосах. Вы можете использовать аналогичную настройку, так как вы использовали бы функцию labeller в facet_grid. Просто сделайте что-нибудь вроде:

new_labels = sapply(levels(df$factor_variable), custom_labeller_function)
df$factor_variable = factor(df$factor_variable, levels = new_labels)

Теперь вы можете использовать factor_variable в facet_wrap.