2016-05-10 2 views
10

Я использую facet_wrap разделить мой график рассеяния, какggplot2: Положите несколько переменных метки facet_wrap на одной линии

facet_wrap(x~y+z) 

Это создает 22 участков в моем случае, как хотелось бы. Однако метка для каждого из этих 22 графиков отображается в 3 строках (x, y и z), которые излишне расходуют пространство в окне и скручивают графики в маленькую область. Я бы предпочел, чтобы мои сюжеты были больше по размеру. Поскольку переменные y и z короткие, я хотел бы отображать их в одной строке вместо двух.

Я заглянул в опции labeller, но ни один из них, похоже, не делает то, что я хочу. Я был бы признателен за любые предложения здесь.

ответ

9

В этом случае вы можете также рассмотреть вопрос о label_wrap_gen():

p <- ggplot(mtcars, aes(wt,mpg)) + geom_point() 
p + facet_wrap(cyl~am+vs, labeller = label_wrap_gen(multi_line=FALSE)) 

Для получения более подробной информации смотрите также here и here ,

6

Я не уверен, как это сделать с помощью функции labeller, но еще один вариант - создать переменную группировки, которая объединяет все три ваши категориальные переменные в одну переменную, которая может использоваться для огранки. Вот пример использования встроенного фрейма данных mtcars и пакета dplyr для создания новой переменной группировки «на лету». После этого это обновление с функцией, которая позволяет динамически выбирать от одной до трех фасетных переменных.

library(dplyr) 

ggplot(mtcars %>% mutate(group = paste(cyl,am,vs, sep="-")), 
     aes(wt,mpg)) + 
    geom_point() + 
    facet_wrap(~group) 

enter image description here

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

library(dplyr) 
library(lazyeval) 

mygg = function(dat, v1, v2, f1, f2=NA, f3=NA) { 

    dat = dat %>% 
    mutate_(group = 
       if (is.na(f2)) { 
       f1 
       } else if (is.na(f3)) { 
       interp(~paste(f1,f2, sep='-'), f1=as.name(f1), f2=as.name(f2)) 
       } else { 
       interp(~paste(f1,f2,f3,sep='-'), f1=as.name(f1), f2=as.name(f2), f3=as.name(f3)) 
       }) 

    ggplot(dat, aes_string(v1,v2)) + 
    geom_point() + 
    facet_wrap(~group) 
} 

Теперь давайте попробовать функцию:

library(vcd) # For Arthitis data frame 

mygg(Arthritis, "ID","Age","Sex","Treatment","Improved") 
mygg(mtcars, "wt","mpg","cyl","am") 
mygg(iris, "Petal.Width","Petal.Length","Species") 

enter image description here

+0

Благодарю вас, это уверенный работает. Однако я хотел бы узнать, есть ли способ сделать это, используя параметры ggplot2. Я могу захотеть facet_wrap мои графики с использованием разных переменных, а также хочу избежать избыточности в моей таблице данных, которая уже огромна. – beeprogrammer

+1

См. Обновленный ответ. Также обратите внимание, что код не добавляет никаких столбцов в объект фрейма данных. Дополнительный столбец добавляется только в функцию ggplot и не изменяет сам объект фрейма данных. – eipi10

Смежные вопросы