2015-10-26 2 views
3

Я создаю четыре графика с использованием xyplot (решетки) и далее объединяю их с grid.arrange (gridExtra).Глобальная легенда, использующая grid.arrange (gridExtra) и графики на основе решетки

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

# Load packages 
require(lattice) 
require(gridExtra) 

# Generate some values 
x1<-rnorm(100,10,4) 
x2<-rnorm(100,10,4) 
x3<-rnorm(100,10,4) 
x4<-rnorm(100,10,4) 
y<-rnorm(100,10,1) 
cond<-rbinom(100,1,0.5) 
groups<-sample(c(0:10),100,replace=TRUE) 
dataa<-data.frame(y,x1,x2,x3,x4,cond,groups) 

# ploting function 
plott<-function(x){ 
xyplot(y~x|cond,groups=groups, 
     col = gray(seq(0.01,0.7,length=length(levels(as.factor(groups))))), 
     pch = 1:length(levels(as.factor(groups))), 
     key = list(space="top", 
        text = list(as.character(levels(as.factor(groups)))), 
        points = TRUE, lines = TRUE, columns = 3, 
        pch = 1:length(levels(as.factor(groups))), 
        col = gray(seq(0.01,0.7,length=length(levels(as.factor(groups))))), 
        cex=1)) 
} 
plot1<-plott(x=x1) 
plot2<-plott(x=x2) 
plot3<-plott(x=x3) 
plot4<-plott(x=x4) 


grid.arrange(plot1,plot2,plot2,plot4,ncol=2) 

В аналогичной должности, я видел, что она может быть выполнена с использованием, например, ggplot2 here и here, но есть ли способ включить глобальную общую легенду, используя gridExtra, и график на основе решетки, например. графика XY?

спасибо.

+1

Да, тот же принцип должен работать для решетчатых участков. решетки и ggplot2 оба используют сетку графики в конце концов. Я не могу показать вам особенности, так как я не очень хорошо разбираюсь в решетке. – Roland

+0

@ Roland вы можете объяснить различия между ggplot2 и решеткой, кажется, что они используются вместе много, но можете ли вы избежать использования решетки и использовать только ggplot2 или наоборот, использовать только решетку и основные команды сетки? Что ggplot2 обеспечивает, что решетка не делает? Я не уверен, какой метод выбрать для этого простого вопроса легенды [здесь] (http://stackoverflow.com/questions/40699787/r-shared-legend-from-a-subplot-to-the-2x2-grid-arrange -ПЕРЕВОРОТНЫЕ-с-решетки). – hhh

+0

Оба ggplot2 и решетка построены на пакете сетки и обеспечивают ему интерфейс высокого уровня. Они не «используются вместе много» (практически никогда), потому что обе обеспечивают ту же функциональность. Лично я не использую решетку. – Roland

ответ

2

Мне удалось создать нечто более близкое к тому, что я впервые представил. Для этого я включаю дополнительный графический элемент, и я использую параметр layout_matrix в grid.arrange, чтобы минимизировать его эффект. Таким образом, я сохраняю легенду и почти исключаю сюжет.

# Load packages 
require(lattice) 
require(gridExtra) 

# Generate some values 
x1<-rnorm(100,10,4) 
x2<-rnorm(100,10,4) 
x3<-rnorm(100,10,4) 
x4<-rnorm(100,10,4) 
y<-rnorm(100,10,1) 
cond<-rbinom(100,1,0.5) 
groups<-sample(c(0:10),100,replace=TRUE) 
dataa<-data.frame(y,x1,x2,x3,x4,cond,groups) 

# ploting function 
plottNolegend<-function(x){ 
    xyplot(y~x|cond,groups=groups, 
     col = gray(seq(0.01,0.7,length=length(levels(as.factor(groups))))), 
     pch = 1:length(levels(as.factor(groups))) 
) 
} 
plott<-function(x){ 
    xyplot(y~x|cond,groups=groups, 
     col = gray(seq(0.01,0.7,length=length(levels(as.factor(groups))))), 
     pch = 1:length(levels(as.factor(groups))), 
     key = list(space="top", 
        text = list(as.character(levels(as.factor(groups)))), 
        points = TRUE, lines = TRUE, columns = 3, 
        pch = 1:length(levels(as.factor(groups))), 
        col = gray(seq(0.01,0.7,length=length(levels(as.factor(groups))))), 
        cex=1)) 
} 
plot1<-plottNolegend(x=x1) 
plot2<-plottNolegend(x=x2) 
plot3<-plottNolegend(x=x3) 
plot4<-plottNolegend(x=x4) 
legend<-plott(x=x4) 



lay <- rbind(c(1,2), 
      c(1,2), 
      c(3,4), 
      c(3,4), 
      c(5,5)) 


grid.arrange(plot1,plot2,plot2,plot4,legend, layout_matrix = lay) 

Plot with global legend at the bottom Обновлено: Ответ был гораздо проще, чем я ожидал. Спасибо за вашу помощь.

# Load packages 
require(lattice) 
require(gridExtra) 
require(grid) 

# Generate some values 
x1<-rnorm(100,10,4) 
x2<-rnorm(100,10,4) 
x3<-rnorm(100,10,4) 
x4<-rnorm(100,10,4) 
y<-rnorm(100,10,1) 
cond<-rbinom(100,1,0.5) 
groups<-sample(c(0:10),100,replace=TRUE) 
dataa<-data.frame(y,x1,x2,x3,x4,cond,groups) 

# ploting function 
plott<-function(x){ 
    xyplot(y~x|cond,groups=groups, 
     col = gray(seq(0.01,0.7,length=length(levels(as.factor(groups))))), 
     pch = 1:length(levels(as.factor(groups))), 
     key = NULL) 
} 
plot1<-plott(x=x1) 
plot2<-plott(x=x2) 
plot3<-plott(x=x3) 
plot4<-plott(x=x4) 


grid.arrange(plot1,plot2,plot2,plot4,ncol=2) 

KeyA<-list(space="top", 
    text = list(as.character(levels(as.factor(groups)))), 
    points = TRUE, lines = TRUE, columns = 11, 
    pch = 1:length(levels(as.factor(groups))), 
    col = gray(seq(0.01,0.7,length=length(levels(as.factor(groups))))), 
    cex=1) 



draw.key(KeyA, draw = TRUE, vp = 
      viewport(.50, .99)) 
+0

Можете ли вы проинструктировать о создании легенды на этом [здесь] (http://stackoverflow.com/questions/40699787/r-shared-legend-from-a-subplot-to-the-2x2-grid-arrange-panel- с-решеткой) с пакетом решетки? – hhh

3

Одним из возможных решений является использование ggplot, намекнул here.

Here is the resulting figure:

my.cols <- 1:3 

my.grid.layout <- rbind(c(1,2), 
         c(3,3)) 

g_legend<-function(a.gplot){ 
    tmp <- ggplot_gtable(ggplot_build(a.gplot)) 
    leg <- which(sapply(tmp$grobs, function(x) x$name) == "guide-box") 
    legend <- tmp$grobs[[leg]] 
    return(legend) 
    } 

legend.plot <- ggplot(iris, aes(x=Petal.Length, y=Sepal.Width,colour=Species)) + 
            geom_line(size=1) + # legend should show lines, not points or rects ... 
            theme(legend.position="right", legend.background = element_rect(colour = "black"), 
             legend.key = element_rect(fill = "white")) + # position, box and background colour of legend 
            scale_color_manual(values=my.cols, name = "Categories") + # manually insert colours as used in corresponding xyplot 
            guides(colour = guide_legend(reverse=T)) # inverts order of colours in legend 

mylegend <- g_legend(legend.plot) 
plot1 <- xyplot(Sepal.Width ~ Petal.Length, groups = Species, data = iris, type = 'l', 
       par.settings = simpleTheme(col=my.cols)) 
plot2 <- xyplot(Sepal.Length ~ Petal.Length, groups = Species, data = iris, type = 'l', 
       par.settings = simpleTheme(col=my.cols)) 


grid.arrange(plot1,plot2,mylegend,layout_matrix=my.grid.layout,    
     top=textGrob(gp=gpar(col='black',fontsize=20),"Some useless example")) 
1

Я думаю, что лучшим решением является использование c.trellis из latticeExtra:

library(latticeExtra) 
c(plot1, plot2, plot3, plot4) 

enter image description here

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