plot übereinander - Zeichnen Sie zwei Graphen in demselben Diagramm in R




mehrere plots (13)

Sie können par und Plot auch auf demselben Diagramm, aber mit unterschiedlicher Achse verwenden. Etwas wie folgt:

plot( x, y1, type="l", col="red" )
par(new=TRUE)
plot( x, y2, type="l", col="green" )

Wenn Sie im Detail über par in R lesen, werden Sie in der Lage sein, wirklich interessante Graphen zu erzeugen. Ein anderes Buch, das man sich ansehen kann, ist Paul Murrels R Graphics.

Ich möchte y1 und y2 in der gleichen Handlung plotten.

x  <- seq(-2, 2, 0.05)
y1 <- pnorm(x)
y2 <- pnorm(x, 1, 1)
plot(x, y1, type = "l", col = "red")
plot(x, y2, type = "l", col = "green")

Aber wenn ich es so mache, werden sie nicht in der gleichen Handlung zusammen geplottet.

In Matlab kann man sich hold on , aber weiß jemand, wie man das in R macht?


tl; dr: Sie möchten eine curve (mit add=TRUE ) oder lines .

Ich stimme mit par(new=TRUE) überein par(new=TRUE) weil das Tick-Marken und Achsenbeschriftungen doppelt drucken wird. Z.B

Der Ausgang der plot(sin); par(new=T); plot( function(x) x**2 ) plot(sin); par(new=T); plot( function(x) x**2 ) plot(sin); par(new=T); plot( function(x) x**2 ) .

Schau, wie versaut die vertikalen Achsenbeschriftungen sind! Da die Bereiche unterschiedlich sind, müsste man ylim=c(lowest point between the two functions, highest point between the two functions) , was weniger einfach ist als das, was ich dir zeigen werde --- und viel weniger einfach, wenn Sie möchten nicht nur zwei Kurven hinzufügen, sondern viele.

Was mich immer am Plotten verwirrt hat, ist der Unterschied zwischen curve und lines . (Wenn Sie sich nicht erinnern können, dass dies die Namen der beiden wichtigen Zeichenbefehle sind, sing Sie einfach.)

Hier ist der große Unterschied zwischen curve und lines .

curve wird eine Funktion wie curve(sin) zeichnen. lines zeichnen Punkte mit x- und y-Werten auf, wie: lines( x=0:10, y=sin(0:10) ) .

Und hier ist ein kleiner Unterschied: Die curve muss aufgerufen werden mit add=TRUE für das, was Sie zu tun versuchen, während lines bereits davon ausgehen, dass Sie zu einem bestehenden Plot hinzufügen.

Hier ist das Ergebnis des Aufrufs plot(0:2); curve(sin) plot(0:2); curve(sin) .

Hinter den Kulissen, schau dir methods(plot) . Und überprüfen Sie body( plot.function )[[5]] . Wenn Sie plot(sin) aufrufen, stellt R fest, dass sin eine Funktion ist (keine y-Werte) und verwendet die Methode plot.function , die zur plot.function . curve ist also das Werkzeug, das für Funktionen gedacht ist.


Wenn Sie den Bildschirm teilen möchten, können Sie es so machen:

(zum Beispiel für 2 Grundstücke nebeneinander)

par(mfrow=c(1,2))

plot(x)

plot(y) 

Referenzlink


Idiomatisches Matlab- plot(x1,y1,x2,y2) kann beispielsweise mit ggplot2 in R übersetzt werden:

x1 <- seq(1,10,.2)
df1 <- data.frame(x=x1,y=log(x1),type="Log")
x2 <- seq(1,10)
df2 <- data.frame(x=x2,y=cumsum(1/x2),type="Harmonic")

df <- rbind(df1,df2)

library(ggplot2)
ggplot(df)+geom_line(aes(x,y,colour=type))

Inspiriert von Tingting Zhao Dual-Plots mit verschiedenen Bereich der x-Achse mit ggplot2 .


Verwenden Sie die matplot Funktion:

matplot(x, cbind(y1,y2),type="l",col=c("red","green"),lty=c(1,1))

Verwenden Sie dies, wenn y1 und y2 an denselben x Punkten ausgewertet werden. Es skaliert die Y-Achse auf das Größere ( y1 oder y2 ), im Gegensatz zu einigen der anderen Antworten hier, die y2 wenn es größer als y1 (ggplot-Lösungen sind meistens in Ordnung).

Alternativ, und wenn die zwei Linien nicht die gleichen x-Koordinaten haben, legen Sie die Achsengrenzen für die erste Zeichnung fest und fügen Sie hinzu:

x1  <- seq(-2, 2, 0.05)
x2  <- seq(-3, 3, 0.05)
y1 <- pnorm(x1)
y2 <- pnorm(x2,1,1)

plot(x1,y1,ylim=range(c(y1,y2)),xlim=range(c(x1,x2)), type="l",col="red")
lines(x2,y2,col="green")

matplot bin erstaunt, dass Q 4 Jahre alt ist und niemand matplot oder x/ylim ...


Ich denke, dass die Antwort, die Sie suchen, ist:

plot(first thing to plot)
plot(second thing to plot,add=TRUE)

Beim ggplot Multilayer-Plots sollte das ggplot Paket berücksichtigt werden. Die Idee besteht darin, ein grafisches Objekt mit einer grundlegenden Ästhetik zu erstellen und schrittweise zu erweitern.

ggplot Stil erfordert, dass Daten in data.frame gepackt data.frame .

# Data generation
x  <- seq(-2, 2, 0.05)
y1 <- pnorm(x)
y2 <- pnorm(x,1,1)
df <- data.frame(x,y1,y2)

Basislösung:

require(ggplot2)

ggplot(df, aes(x)) +                    # basic graphical object
  geom_line(aes(y=y1), colour="red") +  # first layer
  geom_line(aes(y=y2), colour="green")  # second layer

Hier + operator wird verwendet, um zusätzliche Ebenen zum Basisobjekt hinzuzufügen.

Mit ggplot Sie Zugriff auf grafische Objekte in jeder Phase des Plottens. Sagen wir mal, die übliche Schritt-für-Schritt-Konfiguration kann so aussehen:

g <- ggplot(df, aes(x))
g <- g + geom_line(aes(y=y1), colour="red")
g <- g + geom_line(aes(y=y2), colour="green")
g

g erzeugt die Handlung, und Sie können sie in jedem Stadium sehen (gut, nach der Schaffung von mindestens einer Schicht). Weitere Verzauberungen der Handlung werden auch mit erzeugtem Objekt gemacht. Zum Beispiel können wir Etiketten für Achsen hinzufügen:

g <- g + ylab("Y") + xlab("X")
g

Das finale g sieht folgendermaßen aus:

UPDATE (2013-11-08):

Wie in den Kommentaren erwähnt, ggplot die Philosophie von ggplot vor, Daten im Langformat zu verwenden. Sie können diese Antwort https://.com/a/19039094/1796914 beziehen, um den entsprechenden Code zu sehen.


Sie können Punkte für den Overplot verwenden.

plot(x1, y1,col='red')

points(x2,y2,col='blue')

lines() oder points() werden zum bestehenden Graphen hinzugefügt, erstellen aber kein neues Fenster. Also müsstest du machen

plot(x,y1,type="l",col="red")
lines(x,y2,col="green")

Sie können die Plotly R API verwenden , um dies zu formatieren . Unten finden Sie den Code dazu, und die Live-Version dieses Diagramms ist here .

# call Plotly and enter username and key
library(plotly)
p <- plotly(username="Username", key="API_KEY")

# enter data
x  <- seq(-2, 2, 0.05)
y1 <- pnorm(x)
y2 <- pnorm(x,1,1)

# format, listing y1 as your y.
First <- list(
x = x,
y = y1,
type = 'scatter',
mode = 'lines',
marker = list(
    color = 'rgb(0, 0, 255)',
    opacity = 0.5
 )
)

# format again, listing y2 as your y.
Second <- list(
x = x,
y = y2,
type = 'scatter',
mode = 'lines',
opacity = 0.8, 
marker = list(
    color = 'rgb(255, 0, 0)'
 )
)

# style background color
plot_bgcolor = 'rgb(245,245,247)'

# and structure the response. Plotly returns a URL when you make the call. 
response<-p$plotly(list(First,Second), kwargs = list(layout=layout))

Volle Enthüllung: Ich bin im Plotly-Team.


Wie von @redmode beschrieben, können Sie die zwei Zeilen in demselben graphischen Gerät mit ggplot . Die Daten in dieser Antwort waren jedoch in einem "breiten" Format, während es in ggplot im Allgemeinen am bequemsten ist, die Daten in einem ggplot in einem "langen" Format zu halten. Durch die Verwendung verschiedener Gruppierungsvariablen in den AES-Argumenten ändern sich die Eigenschaften der Linie, z. B. Linientyp oder Farbe, entsprechend der Gruppierungsvariablen, und entsprechende Legenden werden angezeigt. In diesem Fall können wir die colour aes sthetics verwenden, die die Farbe der Linien auf verschiedene Ebenen einer Variablen im Datensatz anpasst (hier: y1 vs y2). Aber zuerst müssen wir die Daten vom breiten zum langen Format schmelzen, indem wir die Funktion 'schmelzen' von reshape2 .

library(ggplot2)
library(reshape2)

# original data in a 'wide' format
x  <- seq(-2, 2, 0.05)
y1 <- pnorm(x)
y2 <- pnorm(x, 1, 1)
df <- data.frame(x, y1, y2)

# melt the data to a long format
df2 <- melt(data = df, id.vars = "x")

# plot, using the aesthetics argument 'colour'
ggplot(data = df2, aes(x = x, y = value, colour = variable)) + geom_line()


Wenn Sie Basisgrafiken (dh keine Gitter- / Gittergrafiken) verwenden, können Sie die MATLAB-Haltefunktion nachahmen, indem Sie die Funktionen Punkte / Linien / Polygone verwenden, um zusätzliche Details zu Ihren Diagrammen hinzuzufügen, ohne ein neues Diagramm zu beginnen. Im Fall eines Multiplot-Layouts können Sie par(mfg=...) um auszuwählen, welchem ​​Plot Sie par(mfg=...) hinzufügen.


Von Folie 21 von http://www.slideshare.net/hadley/plyr-one-data-analytic-strategy :

(Hoffentlich ist klar, dass apply entspricht @ Hadleys aaply und aggregate entspricht @ Hadleys ddply etc. Slide 20 der gleichen Slideshare wird klären, wenn Sie es nicht von diesem Bild bekommen.)

(links ist Eingabe, oben wird ausgegeben)







r plot ggplot2 r-faq