2013-06-11 19 views
12

Mi piacerebbe avere un riquadro all'interno di un grafico che rappresenti il ​​25% della larghezza e dell'altezza dell'area di disegno (area in cui si trovano i grafici).Come aggiungere un riquadro (sottotrama) a "topright" di un grafico R?

Ho provato:

# datasets 
d0 <- data.frame(x = rnorm(150, sd=5), y = rnorm(150, sd=5)) 
d0_inset <- data.frame(x = rnorm(1500, sd=5), y = rnorm(1500, sd=5)) 

# ranges 
xlim <- range(d0$x) 
ylim <- range(d0$y) 

# plot 
plot(d0) 

# add inset 
par(fig = c(.75, 1, .75, 1), mar=c(0,0,0,0), new=TRUE) 
plot(d0_inset, col=2) # inset bottomright 

Questo mette l'inserto di topright assoluto e utilizza anche il 25% del dispositivo larghezza. Come posso cambiarlo con le coordinate e la larghezza dell'area in cui si trovano i grafici?

+0

Forse lavorare con 'layout()' (es., [qui] (http: //www.statm ethods.net/advgraphs/layout.html)) in combinazione con 'xpd = TRUE' potrebbe funzionare. – Henrik

+0

C'era un comando che ti dice la dimensione dell'area di tracciamento. –

risposta

9

Esaminare la funzione subplot nel pacchetto TeachingDemos. Potrebbe rendere più facile ciò che stai cercando di fare.

Ecco un esempio:

d0 <- data.frame(x = rnorm(150, sd=5), y = rnorm(150, sd=5)) 
d0_inset <- data.frame(x = rnorm(1500, sd=5), y = rnorm(1500, sd=5)) 

plot(d0) 
subplot( 
    plot(d0_inset, col=2, pch='.', mgp=c(1,0.4,0), 
    xlab='', ylab='', cex.axis=0.5), 
    x=grconvertX(c(0.75,1), from='npc'), 
    y=grconvertY(c(0,0.25), from='npc'), 
    type='fig', pars=list(mar=c(1.5,1.5,0,0)+0.1)) 

enter image description here

+0

Anche con 'sottotrama' È molto difficile controllare la dimensione dell'inset:' Il rettangolo definito da x, y, size, vadj e hadj verrà utilizzato come area di disegno del nuovo grafico. Eventuali segni di graduazione, etichette degli assi, titoli principali e sottotitoli saranno al di fuori di questo rettangolo. –

+1

@Sven, se si imposta 'type = 'fig'' invece del default'' plt'' quindi tutte le etichette, i tick, ecc. sarà all'interno del rettangolo specificato. –

+1

@Sven, ho aggiunto un esempio usando 'subplot' sopra. Questo presuppone che tu lo volessi in basso a destra come nel tuo commento (facile da cambiare in altri angoli) e che volevi che occupasse 1/4 di spazio lineare (1/16 dell'area, anche facile da cambiare). –

14

È possibile utilizzare par("usr") per ottenere i limiti della trama, in coordinate utente, e grconvert[XY] loro convertire in coordinate normalizzate dispositivo (NDC, tra 0 e 1), prima di utilizzarli con par(fig=...).

plot(d0) 
u <- par("usr") 
v <- c(
    grconvertX(u[1:2], "user", "ndc"), 
    grconvertY(u[3:4], "user", "ndc") 
) 
v <- c((v[1]+v[2])/2, v[2], (v[3]+v[4])/2, v[4]) 
par(fig=v, new=TRUE, mar=c(0,0,0,0)) 
plot(d0_inset, axes=FALSE, xlab="", ylab="") 
box() 

Topright inset

+2

Bel esempio. Vorrei notare che si potrebbe aggiungere 'rect (u [2], u [4], (u [1] + u [2])/2, (u [3] + u [4])/2, col = "bianco") 'prima del secondo comando' par' per riempire l'area inserita con il bianco (e disegnare un bordo nero, eliminando la necessità di 'scatola'). –

4

uso par("plt") per scoprire l'area della regione tracciando (sembra essere simile alla risposta Vincents). Stranamente: il fico imposta la dimensione dell'area di disegno del riquadro. Quindi, se mostri l'asse, la dimensione dell'insetto sarà maggiore del 25%.

# datasets 
d0 <- data.frame(x = rnorm(150, sd=5), y = rnorm(150, sd=5)) 
d0_inset <- data.frame(x = rnorm(1500, sd=5), y = rnorm(1500, sd=5)) 

# ranges 
xlim <- range(d0$x) 
ylim <- range(d0$y) 

# plot 
plot(d0) 

# calculate position of inset 
plotdim <- par("plt") 
xleft = plotdim[2] - (plotdim[2] - plotdim[1]) * 0.25 
xright = plotdim[2] # 
ybottom = plotdim[4] - (plotdim[4] - plotdim[3]) * 0.25 # 
ytop  = plotdim[4] # 

# set position for inset 
par(
    fig = c(xleft, xright, ybottom, ytop) 
    , mar=c(0,0,0,0) 
    , new=TRUE 
) 

# add inset 
plot(d0_inset, col=2) # inset bottomright 
1

Per me ha funzionato l'esempio dalla libreria oce: http://finzi.psych.upenn.edu/library/oce/html/plotInset.html

vedere l'esempio:

library(oce) 

## power law in linear and log form 
x <- 1:10 
y <- x^2 
plot(x, y, log='xy',type='l') 
plotInset(3, 1, 10, 8, 
      expr=plot(x,y,type='l',cex.axis=3/4,mgp=c(3/2,1/2,0)), 
      mar=c(2.5,2.5,1,1)) 

## CTD data with location 
data(ctd) 
plot(ctd, which="TS") 
plotInset(29.9, 2.7, 31, 10, 
      expr=plot(ctd, which='map', 
      coastline="coastlineWorld", 
      span=5000, mar=NULL, cex.axis=3/4))