2017-12-28 17 views
0
library(ggplot2) 
library(gridExtra) 

df1 <- data.frame(x=c("A1","A2","A3","A4"),something=c(10,18,24,32),col=rep(c("A","B"),2)) 
df2 <- data.frame(x=c("C1","C2","C3","C4"),somethingelse=c(10543,182334,242334,32255),col=rep(c("A","B"),2)) 


p1 <- ggplot(df1,aes(x,something,fill=col))+ 
    ggtitle("Plot")+ 
    geom_bar(stat="identity")+ 
    theme(legend.position="top", 
     legend.justification="right", 
     legend.direction="horizontal") 
p2 <- ggplot(df2,aes(x,somethingelse,fill=col))+ 
    ggtitle("Plot")+ 
    geom_bar(stat="identity")+ 
    theme(legend.position="top", 
     legend.justification="right", 
     legend.direction="horizontal") 

plot1 plot2ggplot2: Match Grundstück Höhe von kombinierten Plots

Ich habe diese beiden Grundstücke, die Ich mag würde zusammen mit gleicher Breite, gemeinsamen Titel und Legende kombinieren. Ich dachte eher, als die Titel und Legenden-Grobs herauszuziehen, ich würde es auf der obersten Handlung lassen und es in der zweiten Handlung verstecken. Auf diese Weise muss ich die Höhen nicht manuell in grid.arrange() einstellen.

#using loops to generalise to n plots 
plist <- list() 
plist[[1]] <- p1 
plist[[2]] <- p2 
grobs <- list() 

for (i in 1:length(plist)){ 
    if(i!=1) plist[[i]] <- plist[[i]]+theme(legend.position="none",plot.title=element_blank()) 
    grobs[[i]] <- ggplotGrob(plist[[i]]) 
    widths[[i]] <- grobs[[i]]$widths[2:5] 
} 

# fix widths 
maxwidth <- do.call(grid::unit.pmax, widths) 
for (i in 1:length(grobs)){ 
    grobs[[i]]$widths[2:5] <- as.list(maxwidth) 
} 

#plot 
pgrob = do.call("arrangeGrob",grobs) 
grid.arrange(pgrob) 

plot3

Aber hier sind die Grundstücksfläche Höhen sind sehr unterschiedlich. Also stelle ich die Höhe aller Plots manuell als erste ein.

for (i in 1:length(grobs)){ 
    grobs[[i]]$heights[2:5] <- grobs[[1]]$heights[2:5] 
} 

#plot 
pgrob = do.call("arrangeGrob",grobs) 
grid.arrange(pgrob) 

plot4

Nun habe ich am Ende mit diesem großen leeren Raum über dem zweite Grundstück auf. Wie werde ich das los?

+0

Ich empfehle wirklich, mit 'ggpubr' zu bleiben. Es ist sehr gut für die Anpassung von Publikationsqualität Plots (Ausrichten von Plots, Legenden usw.) – PoGibas

Antwort

2

Sie können das ggpubr-Paket verwenden, um für beide Diagramme die gleiche Legende festzulegen (keine Notwendigkeit, Grobs zu extrahieren und die Höhe anzupassen).

library(ggpubr) 
figure <- ggarrange(p1, p2, nrow = 2, align = "v", common.legend = TRUE) 
annotate_figure(figure, fig.lab = "Plot") 

enter image description here explantion:

  • align = "v" richtet Plots vertikal
  • common.legend = TRUE Sätze gleiche Legende für beide Plots
  • annotate_figure fügt Label geteilt

Gebrauchte Daten:

df1 <- data.frame(x=c("A1","A2","A3","A4"),something=c(10,18,24,32),col=rep(c("A","B"),2)) 
df2 <- data.frame(x=c("C1","C2","C3","C4"),somethingelse=c(10543,182334,242334,32255),col=rep(c("A","B"),2)) 

library(ggplot2) 
p1 <- ggplot(df1,aes(x,something,fill=col))+ 
    geom_bar(stat="identity")+ 
    theme(legend.position="top", 
     legend.justification="right", 
     legend.direction="horizontal") 
p2 <- ggplot(df2,aes(x,somethingelse,fill=col))+ 
    geom_bar(stat="identity")+ 
    theme(legend.position="top", 
     legend.justification="right", 
     legend.direction="horizontal") 
1

Wenn Sie können und neu zu strukturieren und rbind Ihre Datenrahmen können Sie facet_wrap(..., scale = "free") verwenden zu bekommen, was Sie wollen.

library(ggplot2) 
library(gridExtra) 

df1 <- data.frame(x=c("A1","A2","A3","A4"),y=c(10,18,24,32),col=rep(c("A","B"),2), type = "something") 
df2 <- data.frame(x=c("C1","C2","C3","C4"),y=c(10543,182334,242334,32255),col=rep(c("A","B"),2), type = "somethingelse") 


df <- rbind(df1, df2) 

ggplot(df,aes(x,y,fill=col))+ 
    ggtitle("Plot")+ 
    geom_bar(stat="identity")+ 
    facet_wrap(~type, ncol = 1, scales = "free") + 
    theme(legend.position="top", 
      legend.justification="right", 
      legend.direction="horizontal") 
Verwandte Themen