2017-02-14 10 views
11

Я попытался сгенерировать несколько участков сетки с помощью ggplot2. Поэтому я хотел бы, чтобы произвести распределение участок с дополнительным boxplot ниже оси х и что для различных групп и переменных вроде этого:ggplot2 - масштабирование нескольких графиков

Example

КОД: Я пытался сделать это с помощью следующего кода:

library(ggplot2) 
require(grid) 

x=rbind(data.frame(D1=rnorm(1000),Name="titi",ID=c(1:1000)), 
    data.frame(D1=rnorm(1000)+1,Name="toto",ID=c(1:1000))) 

space=1 
suite=1 
p1=ggplot(x, aes(x=D1, color=Name, fill=Name)) + 
geom_histogram(aes(y=..density..),alpha=0.35,color=adjustcolor("white",0),position="identity",binwidth = 0.05)+ 
    geom_density(alpha=.2,size=1)+ 
    theme_minimal()+ 
    labs(x=NULL,y="Density")+ 
    theme(legend.position = "top", 
     legend.title = element_blank())+ 
    scale_fill_manual(values=c("gray30","royalblue1"))+ 
    scale_color_manual(values=c("gray30","royalblue1")) 

p2=ggplot(x, aes(x=factor(Name), y=D1,fill=factor(Name),color=factor(Name)))+ 
    geom_boxplot(alpha=0.2)+ 
    theme_minimal()+ 
    coord_flip()+ 
    labs(x=NULL,y=NULL)+ 
    theme(legend.position = "none", 
     axis.text.y = element_blank(), 
     axis.text.x = element_blank(), 
     panel.grid.minor.x = element_blank(), 
     panel.grid.major.x = element_blank(), 
     panel.grid.minor.y = element_blank(), 
     panel.grid.major.y = element_blank())+ 
    scale_fill_manual(values=c("gray30","royalblue1"))+ 
    scale_color_manual(values=c("gray30","royalblue1")) 

grid.newpage() 
pushViewport(viewport(layout=grid.layout(5,1))) 
define_region <- function(row, col){ 
    viewport(layout.pos.row = row, layout.pos.col = col) 
} 
print(p1, vp=define_region(1:4,1)) 
print(p2, vp=define_region(5,1)) 

РЕЗУЛЬТАТ:

enter image description here

ВОПРОС: Во время моего поиска я заметил, что масштаб между графиком распределения плотности и ящиком не отличается (проблема 1). Я не нашел решения для построения этих двух графиков в сетке (я потерян).

+0

@Henrik Большое спасибо за ваш выбор. Я уже тестировал это решение, но я не уверен в этом. –

+0

добавьте строку 'p2 <-p2 + theme (plot.margin = unit (c (0,0.3,0,1,5)," cm "))' будет работать в крайнем случае. Это решение может потребоваться для точной настройки полей поля boxplot. Может быть, если кто-то может придумать способ установить оба или использовать поля «p1» и применить их «p2». – N8TRO

ответ

10

С пакетом cowplot это становится немного проще. Однако мы должны правильно установить диапазон по оси x, чтобы они были одинаковыми для обеих графиков. Это связано с тем, что графики плотности, естественно, немного шире, чем чистые графики данных, поэтому ось для p1 будет немного шире. Когда оси фиксированы, мы можем упорядочить и выровнять их (текст оси и поля больше не будут иметь значения).

library(cowplot) 
comb <- plot_grid(p1 + xlim(-5, 5), 
        p2 + ylim(-5, 5),    # use ylim for p2 because of coord_flip() 
        align = 'v', rel_heights = c(4, 1), nrow = 2) 

enter image description here

Аналогично мы можем организовать кратные комбинационных участков:

plot_grid(comb, comb, comb, comb) 

enter image description here

+0

MAGIC !!! Спасибо очень хорошо @Axeman: D –