2013-03-05 16 views

risposta

6

Ho fatto questo utilizzando qualcosa di simile:

# Making some fake data 
plot1 <- data.frame(x=sample(x=1:10,10,replace=FALSE), 
        y=sample(x=1:10,10,replace=FALSE)) 
plot2 <- data.frame(x=sample(x=1:10,10,replace=FALSE), 
        y=sample(x=1:10,10,replace=FALSE)) 
plot3 <- data.frame(x=sample(x=1:10,10,replace=FALSE), 
        y=sample(x=1:10,10,replace=FALSE)) 

layout(matrix(c(2,1,1,3,1,1),2,3,byrow=TRUE)) 
plot(plot1$x,plot1$y) 
plot(plot2$x,plot2$y) 
plot(plot3$x,plot3$y) 

I comandi matrix e layout consentono di organizzare grafici multipli in un unico appezzamento. Fondamentalmente, tu metti il ​​numero di ogni trama (nell'ordine in cui lo chiamerai) in ogni cella, e poi qualunque sia la disposizione si finisce per essere il modo in cui i tuoi diagrammi sono disposti. Per esempio, nel caso di cui sopra, matrix(c(2,1,1,3,1,1),byrow=TRUE) risultati in una matrice che assomiglia a questo:

 [,1] [,2] [,3] 
[1,] 2 1 1 
[2,] 3 1 1 

Quindi, si può finire con qualcosa di simile:

Example Multiplot

A cura di aggiungere:

Ok, quindi, se vuoi integrare un grafico nell'angolo, puoi farlo usando lo stesso comando layout semplicemente cambiando la matrice. Per esempio, questo è un codice diverso:

layout(matrix(c(1,1,2,1,1,1),2,3,byrow=TRUE)) 
plot1 <- data.frame(x=1:10,y=c(9,10,8,7,3,4,1,2,5,6)) 
plot2 <- data.frame(x=1:10,y=c(6,7,5,1,2,8,3,10,9,4)) 
plot(plot1$x,plot1$y,type="o",col="red") 
plot(plot2$x,plot2$y,type="o",xlab="",ylab="",main="",sub="",col="blue") 

e la matrice risultante è:

 [,1] [,2] [,3] 
[1,] 1 1 2 
[2,] 1 1 1 

La trama che viene fuori assomiglia a questo:

Example Multiplot 2

+0

@TAReham, grazie e se voglio un piccolo grafico all'interno di un altro? –

+0

@Tareham per axample una trama piccola appena in alto e all'interno di un'altra trama? –

+0

Modificata la risposta per mostrare un'alternativa. – TARehman

9

So che questa domanda è già chiuso, ma sto lanciando questo esempio per i posteri.

È possibile eseguire visualizzazioni personalizzate di questo tipo abbastanza facilmente con il pacchetto base "griglia" una volta individuate le nozioni di base. Ecco un rapido esempio di alcune funzioni personalizzate che uso insieme a una demo di tracciamento dei dati.

example plot


funzioni personalizzate


# Function to initialize a plotting area. 
init_Plot <- function(
    .df, 
    .x_Loc, 
    .y_Loc, 
    .justify, 
    .width, 
    .height 
    ){ 

    # Initialize plotting area to fit data. 
    # We have to turn off clipping to make it 
    # easy to plot the labels around the plot. 
    pushViewport(viewport(xscale=c(min(.df[,1]), max(.df[,1])), yscale=c(min(0,min(.df[,-1])), max(.df[,-1])), x=.x_Loc, y=.y_Loc, width=.width, height=.height, just=.justify, clip="off", default.units="npc")) 

    # Color behind text. 
    grid.rect(x=0, y=0, width=unit(axis_CEX, "lines"), height=1, default.units="npc", just=c("right", "bottom"), gp=gpar(fill=space_Background, col=space_Background)) 
    grid.rect(x=0, y=1, width=1, height=unit(title_CEX, "lines"), default.units="npc", just=c("left", "bottom"), gp=gpar(fill=space_Background, col=space_Background)) 

    # Color in the space. 
    grid.rect(gp=gpar(fill=chart_Fill, col=chart_Col)) 
} 

# Function to finalize and label a plotting area. 
finalize_Plot <- function(
    .df, 
    .plot_Title 
    ){ 

    # Label plot using the internal reference 
    # system, instead of the parent window, so 
    # we always have perfect placement. 
    grid.text(.plot_Title, x=0.5, y=1.05, just=c("center","bottom"), rot=0, default.units="npc", gp=gpar(cex=title_CEX)) 
    grid.text(paste(names(.df)[-1], collapse=" & "), x=-0.05, y=0.5, just=c("center","bottom"), rot=90, default.units="npc", gp=gpar(cex=axis_CEX)) 
    grid.text(names(.df)[1], x=0.5, y=-0.05, just=c("center","top"), rot=0, default.units="npc", gp=gpar(cex=axis_CEX)) 

    # Finalize plotting area. 
    popViewport() 
} 

# Function to plot a filled line chart of 
# the data in a data frame. The first column 
# of the data frame is assumed to be the 
# plotting index, with each column being a 
# set of y-data to plot. All data is assumed 
# to be numeric. 
plot_Line_Chart <- function(
    .df, 
    .x_Loc, 
    .y_Loc, 
    .justify, 
    .width, 
    .height, 
    .colors, 
    .plot_Title 
    ){ 

    # Initialize plot. 
    init_Plot(.df, .x_Loc, .y_Loc, .justify, .width, .height) 

    # Calculate what value to use as the 
    # return for the polygons. 
    y_Axis_Min <- min(0, min(.df[,-1])) 

    # Plot each set of data as a polygon, 
    # so we can fill it in with color to 
    # make it easier to read. 
    for (i in 2:ncol(.df)){ 
     grid.polygon(x=c(min(.df[,1]),.df[,1], max(.df[,1])), y=c(y_Axis_Min,.df[,i], y_Axis_Min), default.units="native", gp=gpar(fill=.colors[i-1], col=.colors[i-1], alpha=1/ncol(.df))) 
    } 

    # Draw plot axes. 
    grid.lines(x=0, y=c(0,1), default.units="npc") 
    grid.lines(x=c(0,1), y=0, default.units="npc") 

    # Finalize plot. 
    finalize_Plot(.df, .plot_Title) 

} 

codice Demo


grid.newpage() 

# Specify main chart options. 
chart_Fill = "lemonchiffon" 
chart_Col = "snow3" 
space_Background = "white" 
title_CEX = 1.4 
axis_CEX = 1 

plot_Line_Chart(data.frame(time=1:1860, EuStockMarkets)[1:5], .x_Loc=1, .y_Loc=0, .just=c("right","bottom"), .width=0.9, .height=0.9, c("dodgerblue", "deeppink", "green", "red"), "EU Stocks") 

# Specify sub-chart options. 
chart_Fill = "lemonchiffon" 
chart_Col = "snow3" 
space_Background = "lemonchiffon" 
title_CEX = 0.8 
axis_CEX = 0.7 

for (i in 1:4){ 
    plot_Line_Chart(data.frame(time=1:1860, EuStockMarkets)[c(1,i + 1)], .x_Loc=0.15*i, .y_Loc=0.8, .just=c("left","top"), .width=0.1, .height=0.1, c("dodgerblue", "deeppink", "green", "red")[i], "EU Stocks") 
} 
+0

Wow. Questo fa decisamente comparire la mia risposta al confronto. :) – TARehman

+0

@TARehman La differenza principale, tuttavia, è che il metodo 'par' nella tua risposta può accettare le funzioni di tracciamento di base, mentre il metodo 'griglia' richiederà di specificare i propri metodi di tracciamento. È principalmente una questione di tempo e solo quanto personalizzato deve essere la tua trama. – Dinre

+1

La domanda non è chiusa e l'OP ha sicuramente la possibilità di cambiare la propria scelta su quale risposta ottiene il segno di spunta. – Dason

6

È inoltre possibile utilizzare par(fig=..., new=TRUE).

x <- rnorm(100) 
hist(x, col = "light blue") 
par(fig = c(.7, .95, .7, .95), mar=.1+c(0,0,0,0), new = TRUE) 
qqnorm(x, axes=FALSE, xlab="", ylab="", main="") 
qqline(x, col="blue", lwd=2) 
box() 

smaller plot in a corner

+0

Mi piace molto questa opzione per la sua semplicità e capacità di usare le funzioni di tracciamento di base. Essendo un utente di "griglia", non ne ho l'uso da solo, ma dovrò ricordarlo per gli altri che chiedono. Grazie per averlo indicato. – Dinre

6

La funzione subplot nel pacchetto TeachingDemos fa esattamente questo per la grafica di base.

Creare il grafico a dimensione intera, quindi chiamare subplot con il comando di stampa che si desidera nella sottotrama e specificare la posizione della sottotrama. La posizione può essere specificata da parole chiave come "topleft" o puoi dargli le coordinate nel sistema di coordinate utente corrente dei grafici.

Problemi correlati