2016-08-26 6 views
6

Возможно ли иметь независимые темы для каждой переменной, используемой в ggplot2 facet_wrap?Независимые темы полосы для ggplot2 facet_wrap, использующие более одной переменной

Возьмите этот кусок кода в качестве примера:

p1 <- ggplot(mpg, aes(displ, hwy)) + 
    geom_point() + 
    facet_wrap(c("cyl", "drv"), labeller = "label_both") 
plot(p1) 

Plot output

Я хотел бы иметь верхнюю полосу («цил») с другой темой - скажем, выделены жирным шрифтом. Кроме того, мне может понадобиться сделать «drv» курсив и с другим типом и размером шрифта. Как я мог это сделать?

Я думал, что-то в строках:

p1 <- p1 + theme(strip.text.variable1 = element_text(face = 'bold'), 
        strip.text.variable2 = element_text(face = 'italic', size = 8) 
       ) 

К сожалению, я не мог найти ничего подобного в документации или на предыдущие вопросы.

Приветствие

Изменить: Я сделал вопрос немного более универсальны для дальнейшей помощи сообщества.

+2

[Как использовать различные размеры шрифта в ggplot фаска обернуть этикетки?] (Http://stackoverflow.com/questions/36334486/how-to-use-different-font-sizes- in-ggplot-facet-wrap-labels) представляется актуальным. – Henrik

ответ

3

Ostensibly вы должны быть в состоянии сделать новую функцию, основанную на label_both возвращать смелые ярлыки, но до сих пор мои попытки закончились страшной Error in variable[[i]] : subscript out of bounds.

Альтернативой этому является создание функции для создания метки, которую вы хотите. Это очень похоже на this answer. В этой функции вы добавляете префикс к значениям переменной и делаете их полужирным.

make_labels = function(string, prefix = "cyl: ") { 
    x = paste0(prefix, as.character(string)) 
    do.call(expression, lapply(x, function(y) bquote(bold(.(y))))) 
} 

Теперь использовать эту функцию в as_labeller для «цил» переменной в facet_wrap. Вы хотите изменить стандартную метку в пределах as_labeller до label_parsed, чтобы выражение правильно разбиралось. Для другой переменной используйте label_both.

ggplot(mpg, aes(displ, hwy)) + 
    geom_point() + 
    facet_wrap(c("cyl", "drv"), 
       labeller = labeller(cyl = as_labeller(make_labels, default = label_parsed), 
            drv = label_both)) 

enter image description here

+0

Это определенно один выход, спасибо. Тем не менее, я застрял с использованием параметра 'label_both' для« cyl », чтобы привязать вызов' prefix = "cyl:" '. Было бы также интересно использовать эту функцию без ограничений (например, вместо «label_value»). –

+0

Я согласен с тем, что было бы неплохо не жестко закодировать лейбл к вашей конкретной переменной (хотя вам не нужно использовать '" cyl: "', используйте любое имя своей переменной). Я не совсем следую вашему второму предложению, так как функция, которую я написал, специально предназначена для использования с 'label_parsed', чтобы использовать' bold'. – aosmith

+0

Да, я имел в виду '" cyl: "' только в качестве примера (в моем случае это метод ':" '). Извините, если я не был ясно о втором предложении. Я хотел сказать, что это решение работает только в том случае, если мы явно помещаем имя переменной в функцию (и оно включается в полосу) - было бы хорошо, если бы она работала, если бы я не хотел, чтобы "cyl : 4 "," cyl: 5 "," cyl 6 "," cyl: 8 "в тексте полосы, только« 4 »,« 5 »,« 6 »и« 8 ». –