Question Tracer deux graphiques dans la même parcelle en R


Je voudrais tracer y1 et y2 dans le même complot.

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")

Mais quand je le fais comme ça, ils ne sont pas complétés dans la même parcelle.

Dans Matlab on peut faire hold on, mais est-ce que quelqu'un sait comment faire cela dans R?


449
2018-04-01 23:28


origine


Réponses:


lines() ou points() va ajouter au graphique existant, mais ne créera pas une nouvelle fenêtre. Donc tu devrais faire

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

481
2018-04-01 23:33



Vous pouvez aussi utiliser par et tracer sur le même graphique mais axe différent. Quelque chose comme suit:

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

Si vous lisez en détail à propos de par dans R, vous serez capable de générer des graphiques vraiment intéressants. Un autre livre à regarder est R Graphics de Paul Murrel.


165
2018-01-27 23:42



Lors de la construction de tracés multicouches, il convient de considérer ggplot paquet. L'idée est de créer un objet graphique avec une esthétique de base et de l'améliorer progressivement.

ggplot le style exige que les données soient empaquetées data.frame.

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

Solution de base:

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

Ici + operator est utilisé pour ajouter des couches supplémentaires à l'objet de base.

Avec ggplot vous avez accès à un objet graphique à chaque étape du traçage. Dites, l'installation étape par étape habituelle peut ressembler à ceci:

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 produit l'intrigue, et vous pouvez le voir à chaque étape (enfin, après la création d'au moins une couche). D'autres enchantements de l'intrigue sont également réalisés avec l'objet créé. Par exemple, nous pouvons ajouter des étiquettes pour les axises:

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

Final g ressemble à:

enter image description here

MISE À JOUR (2013-11-08):

Comme indiqué dans les commentaires, ggplotLa philosophie préconise l'utilisation de données en format long. Vous pouvez vous référer à cette réponse https://stackoverflow.com/a/19039094/1796914 afin de voir le code correspondant.


89
2018-06-17 18:34



Je pense que la réponse que vous cherchez est:

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

29
2017-08-18 10:53



Utilisez le matplot fonction:

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

utilisez ceci si y1 et y2 sont évalués au même x points. Il met à l'échelle l'axe Y pour s'adapter à celui qui est le plus grand (y1 ou y2), contrairement à d'autres réponses ici y2 si cela devient plus grand que y1 (Les solutions de ggplot sont pour la plupart d'accord avec cela).

Sinon, et si les deux lignes n'ont pas les mêmes coordonnées x, définissez les limites d'axe sur le premier tracé et ajoutez:

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")

Suis étonné ce Q a 4 ans et personne n'a mentionné matplot ou x/ylim...


21
2018-03-14 15:04



tl; dr: Vous voulez utiliser curve (avec add=TRUE) ou lines.


je suis en désaccord avec par(new=TRUE) car cela double l'impression des repères et des étiquettes d'axes. Par exemple

sine and parabola

La sortie de plot(sin); par(new=T); plot( function(x) x**2 ).

Regardez à quel point les étiquettes des axes verticaux sont en désordre! Comme les plages sont différentes, vous devez définir ylim=c(lowest point between the two functions, highest point between the two functions), ce qui est moins facile que ce que je suis sur le point de vous montrer --- et façon moins facile si vous voulez ajouter non seulement deux courbes, mais beaucoup.


Ce qui me déroutait toujours au sujet du tracé est la différence entre curve et lines. (Si vous ne pouvez pas vous rappeler que ce sont les noms des deux commandes de traçage importantes, juste chanter il.)

Voici la grande différence entre curve et lines.

curve va tracer une fonction, comme curve(sin). lines Trace des points avec des valeurs x et y, comme: lines( x=0:10, y=sin(0:10) ).

Et voici une différence mineure: curve doit être appelé avec add=TRUE pour ce que vous essayez de faire, tout en lines suppose déjà que vous ajoutez à une parcelle existante.

id & sine

Voici le résultat de l'appel plot(0:2); curve(sin).


Dans les coulisses, consultez methods(plot). Et vérifie body( plot.function )[[5]]. Quand vous appelez plot(sin) R comprend que sin est une fonction (pas de valeurs y) et utilise le plot.function méthode, qui finit par appeler curve. Alors curve est l'outil destiné à gérer les fonctions.


21
2018-04-01 23:34



Si vous utilisez des graphiques de base (c'est-à-dire des graphiques en treillis / grille), vous pouvez imiter la fonction d'attente de MATLAB en utilisant les fonctions points / lignes / polygones pour ajouter des détails supplémentaires à vos tracés sans lancer de nouveau tracé. Dans le cas d'une disposition en multiplots, vous pouvez utiliser par(mfg=...) pour choisir quelle parcelle vous ajoutez des choses.


15
2017-09-26 21:32



Comme décrit par @redmode, vous pouvez tracer les deux lignes dans le même périphérique graphique en utilisant ggplot. Cependant, les données dans cette réponse étaient dans un format «large», alors que dans ggplot il est généralement plus pratique de conserver les données dans une trame de données dans un format «long». Ensuite, en utilisant différentes «variables de regroupement» dans le aesarguments thetics, les propriétés de la ligne, telles que le type de ligne ou la couleur, varient en fonction de la variable de regroupement, et les légendes correspondantes apparaîtront. Dans ce cas, nous pouvons utiliser le colour  aessthetics, qui associe la couleur des lignes à différents niveaux d'une variable dans l'ensemble de données (ici: y1 vs y2). Mais nous devons d'abord faire fondre les données du format large au format long, en utilisant la fonction 'melt' de reshape2 paquet.

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()

enter image description here


15
2017-10-21 13:39



Si vous voulez diviser l'écran, vous pouvez le faire comme ceci:

(par exemple pour 2 parcelles à côté)

par(mfrow=c(1,2))

plot(x)

plot(y) 

Lien de référence


14
2017-10-21 01:29