2016-12-07 1 views
0

Проблема в том, что у меня есть набор данных, где я хочу построить n "y" переменные против одной переменной «x» в ggplot2. Затем я хочу сделать несколько множителей для k уровней фактора и сохранить все k mulitplots в одном файле.Как создать график с несколькими фигурами (множитель) для каждого уровня фактора (n> 1) и сохранить в файле в R

Например, рассмотрите данные mtcars. Я могу генерировать фигуру у = л VS. х = миль в часе и отдельной фигура у = вес по сравнению с й = мили в часе и положить их вместе в один Multiplot по:

library(dplyr) 
library(ggplot2) 
library(gridExtra) 
library(cowplot) 

a1 <- ggplot(mtcars,aes(mpg,hp))+geom_point() 
b1 <- ggplot(mtcars,aes(mpg,wt))+geom_point() 
p <- grid.arrange(a1,b1) 

ОК, теперь я хочу, чтобы создать один и тот же множитель, но для разных уровней фактора «am». (Edit: Я хотел бы иметь один множитель для am = 0 и один множитель для am = 1) Я нашел решение для создания графиков на основе коэффициента и сохранения в одном файле [здесь] How subset a data frame by a factor and repeat a plot for each subset?

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

plots = mtcars %>% 
group_by(am) %>% 
do({a = a1 %+% . 
b = b1 %+% . 
plots = p %+% .}) 

Я также попытался:

plots = mtcars %>% 
group_by(am) %>% 
do({a1 = ggplot(.,aes(mpg,hp))+geom_point() 
b1 = ggplot(.,aes(mpg,wt))+geom_point() 
p = grid.arrange(a1,b1)}) 

в обеих случаях у меня есть ошибка

Error: Results are not data frames at positions: 1, 2 

Я понимаю, что проблема с фреймом данных. Но я не понимаю, почему это проблема в моем коде, а не в примере кода. Любая помощь приветствуется! Заранее спасибо.

EDIT:

После TIMS пост ниже, собираются могут быть использованы для достижения конечного результата, что я ищу.

library(tidyr) 
dat1 <- mtcars %>% 
gather(key, value, hp, wt) 

p <- ggplot(dat1,aes(mpg, value)) + 
geom_point() + 
facet_wrap(~ key, scales = "free_y") 

plots = dat1 %>% 
group_by(am) %>% 
do(
plots = p %+% .) 

pdf() 
plots$plots 
dev.off() 

Однако это не позволяет значительно упростить настройку отдельных графиков для разных переменных. Скажем, я хотел добавить строку с использованием geom_vline для построения hp против mpg, но не иметь ее на графике wt против mpg. Я не уверен, что вы можете сделать это в этом методе.

ответ

0

Если я не понимаю ваш вопрос, я думаю, что вы делаете это немного сложнее, чем должно быть. Вы хотите получить сетку из двух графиков, hp ~ mpg и wt ~ mpg, а также продемонстрировать значение am.

Моя первоначальная реакция заключается в использовании tidyr::gather группе hp и wt:

library(ggplot2) 
library(tidyr) 

mtcars %>% 
    gather(key, value, hp, wt) 

Теперь вместо переменных hp и wt у вас есть переменные key (которые содержат или «л» или «вес» в качестве значений) и value, который содержит соответствующее значение «hp» или «wt».

После этого вы строите свои первоначальные трубы участка (заметьте, я в первом заявлении в качестве параметра данных для ggplot:

mtcars %>% 
    gather(key, value, hp, wt) %>% 
    ggplot(aes(mpg, value, color = as.factor(am)) + 
    geom_point() 

В эстетике я запрашиваемая утро (как фактор), который будет использоваться для различения цвет

Теперь вы хотите провести сетку, так что facet_wrap() станет вашим другом.

mtcars %>% 
    gather(key, value, hp, wt) %>% 
    ggplot(aes(mpg, value, color = as.factor(am))) + 
    geom_point() + 
    facet_wrap(~ key, nrow = 2, scales = "free_y") 

С facet_wrap Я спрашиваю ggplot2 построить график для каждого уникального значения key который содержит «л» и «вес». Таким образом, я получу два графика на одном сюжете. Поскольку ваш оригинальный пример был уложен, я использую nrow = 2. И, поскольку «hp» и «wt» не похожи в значениях, вы должны использовать параметр scales = "free_y". Это означает, что каждый граф будет использовать свою ось Y для точного отображения данных.

И, наконец, если вы не хотите «as.factor (am)» как название вашей легенды (и кто это делает?), Используйте scale_color_discrete(). Мы используем цвет, потому что это то, что мы назначили переменной am (вместо заполнения, размера, формы и т. Д.), А затем дискретным, потому что am является дискретной переменной.

Так что ваш код заканчивается так:

mtcars %>% 
    gather(key, value, hp, wt) %>% 
    ggplot(aes(mpg, value, color = as.factor(am))) + 
    geom_point() + 
    facet_wrap(~ key, nrow = 2, scales = "free_y") + 
    scale_color_discrete(guide = guide_legend(title = element_text("am"))) 

И ваш участок заканчивается так:

enter image description here

Если я неправильно понял ваш вопрос, я буду счастлив редактировать по мере необходимости ,

+0

Небольшое недоразумение. Я не хочу, чтобы все уровни «я» были в одном сюжете. В вашем примере у вас есть два графика в одном мультимножении. Я хочу 2 графика в одном мультиплексе для am = 0 и 2 графиков в одном мультиплексе для am = 1. Я хотел бы сохранить как PDF так, чтобы у меня было 2 графика на странице 1, соответствующие am = 0 и 2 графикам на стр. 2, соответствующие am = 1. – Micky

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