Tracer deux graphiques dans le même tracé en R

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

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 tracés dans le même complot ensemble.

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

461
demandé sur Henrik 2010-04-02 03:28:14

15 réponses

lines() ou points() ajoutera au graphique existant, mais ne créera pas de nouvelle fenêtre. Donc, vous devez faire

plot(x,y1,type="l",col="red")
lines(x,y2,col="green")
497
répondu bnaul 2012-06-01 05:57:33

Vous pouvez également utiliser par et tracer sur le même graphique mais un 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 sur par dans R, vous serez en mesure de générer des graphiques vraiment intéressants. Un autre livre à regarder est R Graphics DE Paul Murrel.

175
répondu Sam 2014-03-04 15:43:12

Lors de la construction de tracés multicouches, il faut considérer ggplot package. 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 nécessite que les données soient empaquetées dans 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 calques supplémentaires à l'objet de base.

Avec ggplot Vous avez accès à l'objet graphique à chaque étape du traçage. Dites, la configuration habituelle étape par étape peut ressembler à ce:

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

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

Finale g ressemble:

entrez la description de l'image ici

Mise à jour (2013-11-08):

Comme indiqué dans les commentaires, la philosophie de ggplot suggère d'utiliser des 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.

95
répondu redmode 2017-05-23 11:47:29

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

plot(first thing to plot)
plot(second thing to plot,add=TRUE)
31
répondu user3749764 2014-06-17 18:34:45

Utilisez la fonction matplot:

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

Utilisez ceci si y1 et y2 sont évalués aux mêmes x points. Il adapte l'axe des Y pour s'adapter à celui qui est le plus grand (y1 ou y2), contrairement à certaines des autres réponses ici qui vont couper y2 si elle devient plus grande que y1 (les solutions ggplot sont généralement 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 est 4 ans et personne n'a mentionné matplot ou x/ylim...

23
répondu Spacedman 2014-08-18 10:53:24

Tl;dr: Vous souhaitez utiliser curve (avec add=TRUE) ou lines.


Je ne suis pas d'accord avec par(new=TRUE) parce que cela va double-imprimer les marques de tiques et les étiquettes d'axe. Par exemple

sinus et de la parabole

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

Regardez à quel point les étiquettes d'axe vertical sont foiré! Depuis les plages sont différentes, vous devez définir la ylim=c(lowest point between the two functions, highest point between the two functions), ce qui est moins facile que ce que je vais vous montrer---et chemin moins facile si vous voulez ajouter ce ne sont pas deux courbes, mais beaucoup.


Ce qui m'a toujours confus au sujet du traçage est la différence entre curve et lines. (si vous ne vous souvenez pas que ce sont les noms des deux commandes de traçage importantes, il suffit de 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 quoi vous essayez de le faire, alors que lines suppose déjà que vous ajoutez à un tracé existant.

id & sine

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


Dans les coulisses, consultez methods(plot). Et cochez body( plot.function )[[5]]. Lorsque vous appelez plot(sin) R détermine que sin est une fonction (Pas de valeurs y) et utilise la méthode plot.function, qui finit par appeler curve. Donc curve est l'outil destiné à gérer les fonctions.

21
répondu isomorphismes 2015-05-26 19:43:39

Si vous utilisez des graphiques de base (c'est-à-dire pas des graphiques en treillis/ grille), vous pouvez imiter la fonction hold on de MATLAB en utilisant les fonctions points/lignes/polygones pour ajouter des détails supplémentaires à vos tracés sans démarrer un nouveau tracé. Dans le cas d'une mise en page multiplot, vous pouvez utiliser par(mfg=...) pour choisir le tracé auquel vous ajoutez des éléments.

15
répondu mcabral 2012-06-01 05:58:17

Comme décrit par @redmode, vous pouvez tracer les deux lignes dans le même périphérique graphique en utilisant ggplot. Toutefois, les données dans la réponse était dans un grand format, alors que dans ggplot, il est généralement plus pratique de conserver les données dans un bloc de données dans un long format. Ensuite, en utilisant différentes 'variables de regroupement' dans les arguments aes, les propriétés de la ligne, telles que le type de ligne ou la couleur, varieront en fonction de la variable de regroupement, et les légendes correspondantes apparaîtront. Dans ce cas, nous pouvons utiliser le colour aessthetics, qui fait correspondre 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' du paquet 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()

entrez la description de l'image ici

15
répondu Henrik 2013-09-26 22:34:49

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

(par exemple pour 2 parcelles ensemble)

par(mfrow=c(1,2))

plot(x)

plot(y) 

Lien De Référence

14
répondu Hamed2005 2015-11-08 18:26:11

Vous pouvez utiliser des points pour le surplace, c'est-à-dire.

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

points(x2,y2,col='blue')
9
répondu brainstorm 2012-10-21 05:15:41

Plutôt que de conserver les valeurs à tracer dans un tableau, stockez-les dans une matrice. Par défaut, la matrice entière sera traitée comme un ensemble de données. Cependant, si vous ajoutez le même nombre de modificateurs au tracé, par exemple col(), comme vous avez des lignes dans la matrice, R comprendra que chaque ligne doit être traitée indépendamment. Par exemple:

x = matrix( c(21,50,80,41), nrow=2 )
y = matrix( c(1,2,1,2), nrow=2 )
plot(x, y, col("red","blue")

Cela devrait fonctionner à moins que vos ensembles de données ne soient de tailles différentes.

6
répondu cranberry 2012-07-02 23:30:17

Idiomatiques Matlab plot(x1,y1,x2,y2) peut être traduit en R avec ggplot2 par exemple de cette façon:

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

entrez la description de l'image ici

inspiré par Tingting Zhao double ligne tracés avec différentes gamme de x-axe en utilisant ggplot2 .

5
répondu Alessandro Jacopson 2018-02-26 09:16:56

Vous pouvez également créer votre tracé en utilisant ggvis :

library(ggvis)

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

df %>%
  ggvis(~x, ~y1, stroke := 'red') %>%
  layer_paths() %>%
  layer_paths(data = df, x = ~x, y = ~y2, stroke := 'blue')

Cela va créer le tracé suivant:

entrez la description de l'image ici

4
répondu epo3 2017-01-25 14:36:32

Vous pouvez utiliser l'API Plotly R pour styliser ceci. Voici le code pour le faire, et la version live de ce graphique est ici .

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

Divulgation complète: je suis dans L'équipe Plotly.

Graphique

3
répondu Mateo Sanchez 2014-01-22 04:48:30

Nous pouvons également utiliser la bibliothèque de treillis

library(lattice)
x <- seq(-2,2,0.05)
y1 <- pnorm(x)
y2 <- pnorm(x,1,1)
xyplot(y1 + y2 ~ x, ylab = "y1 and y2", type = "l", auto.key = list(points = FALSE,lines = TRUE))

Pour des couleurs spécifiques

xyplot(y1 + y2 ~ x,ylab = "y1 and y2", type = "l", auto.key = list(points = F,lines = T), par.settings = list(superpose.line = list(col = c("red","green"))))

entrez la description de l'image ici

0
répondu Varn K 2018-09-25 18:56:27