2013-06-11 4 views
12

Ich hätte gerne eine Einfügung innerhalb eines Diagramms, das 25% der Breite und Höhe des Zeichenbereichs (Bereich, in dem die Graphen liegen) ausmacht.Wie fügt man ein Inset (Subplot) zu "topright" eines R-Plots hinzu?

Ich habe versucht:

# 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 

Diese den Einsatz zur absoluten topright setzt und verwendet auch 25% der Gerätebreite. Wie kann ich die Koordinaten und die Breite des Bereichs ändern, in dem sich die Diagramme befinden?

+0

Vielleicht arbeiten mit 'layout()' (zB [hier] (http: //www.statm ethods.net/advgraphs/layout.html)) in Kombination mit 'xpd = TRUE' könnte funktionieren. – Henrik

+0

Es gab einen Befehl, der Ihnen die Dimension des Zeichenbereichs angibt. –

Antwort

9

Blick auf die subplot Funktion im TeachingDemos Paket. Es kann machen, was Sie versuchen, einfacher zu machen. Hier

ein Beispiel:

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

Auch mit 'subplot' Es ist sehr schwierig, die Größe des Einschubs zu steuern:' Das durch x, y, size, vadj und hadj definierte Rechteck wird als Zeichenfläche des neuen Plots verwendet. Alle Teilstriche, Achsenbeschriftungen, Haupt- und Unterüberschriften befinden sich außerhalb dieses Rechtecks. " –

+1

@Sieben, wenn Sie' type = 'fig'' anstelle des Standard '' plt''s setzen, dann werden alle Beschriftungen, Ticks, etc . wird innerhalb des angegebenen Rechtecks ​​sein. –

+1

@Sven, ich habe ein Beispiel mit 'subplot' hinzugefügt. Dies setzt voraus, dass Sie es rechts unten in Ihrem Kommentar haben wollten (leicht zu anderen Ecken wechseln) und dass Sie wollten, dass es 1/4 lineares Leerzeichen (1/16 des Bereichs, auch einfach zu ändern) nimmt. –

14

können Sie par("usr") verwenden, um die Grenzen des Grundstücks zu erhalten, in Benutzerkoordinaten, und grconvert[XY] sie zu konvertieren zu normalisierten Gerätekoordinaten (NDC, zwischen 0 und 1), bevor sie mit par(fig=...) verwenden.

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

Schönes Beispiel. Ich würde bemerken, dass man "rect" (u [2], u [4], (u [1] + u [2])/2, (u [3] + u [4])/2, col = hinzufügen könnte "weiß") 'vor dem zweiten' par'-Befehl, um den Inset-Bereich mit Weiß zu füllen (und einen schwarzen Rand zu zeichnen, wodurch "Box" überflüssig wird). –

4

Verwendung par("plt") den Bereich der Plotten Region, um herauszufinden, (scheint vincents Antwort ähnlich zu sein). Seltsamerweise: fig legt die Größe des Zeichenbereichs des Einschubs fest. Wenn also die Achse angezeigt wird, ist die Größe des Einsatzes größer als Ihre 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

Für mich das Beispiel aus der oce Bibliothek gearbeitet: http://finzi.psych.upenn.edu/library/oce/html/plotInset.html

Siehe Beispiel:

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)) 
Verwandte Themen