672 votes

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

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

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 lorsque je procède de cette manière, ils ne sont pas placés ensemble dans la même parcelle.

En Matlab, on peut faire hold on mais quelqu'un sait-il comment faire cela en R ?

5 votes

Vérifiez ?curve . Utilisez add=TRUE .

0 votes

Ver cette question pour des réponses plus spécifiques sur ggplot2.

712voto

bnaul Points 4006

lines() o points() s'ajoutera au graphique existant, mais ne créera pas de nouvelle fenêtre. Vous devez donc faire

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

12 votes

Pourquoi cela ne fonctionne-t-il pas dans l'exemple simple suivant ? > plot(sin) > lines(cos) Error in as.double(y) : cannot coerce type 'builtin' to vector of type 'double'.

26 votes

C'est facile à voir. Avec plot(sin), vous passez une fonction au lieu de données réelles. plot() le détectera et utilisera à son tour plot.function() pour tracer votre fonction (lisez la section sur la répartition multiple pour en savoir plus). Cependant, lines.function() n'est pas défini, donc lines() ne sait pas quoi faire avec un paramètre de la classe function. lines peut seulement traiter vos données et les objets de série temporelle de la classe ts.

36 votes

@Frank Fais-le comme ça : plot(sin); curve(cos, add=TRUE) .

252voto

Sam Points 932

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

3 votes

Mon R me donne une erreur : Erreur dans par(fig(new = TRUE)) : impossible de trouver la fonction "fig".

8 votes

Votre méthode préserve-t-elle la bonne échelle (axe des y) pour les deux graphiques ?

1 votes

@uvts_cvs Oui, cela préserve le graphique original in toto.

140voto

redmode Points 2138

Lorsque l'on construit des diagrammes multicouches, il faut prendre en compte 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 exige que les données soient emballé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 couches supplémentaires à un objet de base.

Avec ggplot vous avez accès à des objets graphiques à chaque étape du traçage. Par exemple, une configuration habituelle étape par étape 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 le tracé, et vous pouvez le voir à chaque étape (enfin, après la création d'au moins une couche). D'autres enchantements du tracé sont également réalisés avec l'objet créé. Par exemple, on peut ajouter des étiquettes pour les axes :

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

Final g ressemble :

enter image description here

MISE À JOUR (2013-11-08) :

Comme indiqué dans les commentaires, ggplot La philosophie de la Commission suggère d'utiliser des données au format long. Vous pouvez vous référer à ce responder afin de voir le code correspondant.

5 votes

Como suggéré par Henrik les données doivent vraiment être au format "long", ggplot gère cela plus naturellement que le format "large" que vous utilisez.

1 votes

@Henrik : Non, merci pour votre réponse en premier lieu. Peut-être que l'auteur de cette réponse peut l'éditer pour qu'elle corresponde bien à ggplot La philosophie de l'entreprise...

3 votes

M'a appris à définir x sur ggplot(aes()) et ensuite y par lui-même sur geom_*(). Super !

21voto

Henrik Points 12148

Comme décrit par @redmode, vous pouvez tracer les deux lignes dans le même dispositif graphique en utilisant ggplot . Dans cette réponse, les données étaient dans un format "large". Cependant, en utilisant ggplot il est généralement plus pratique de conserver les données dans un cadre de données au format "long". Ensuite, en utilisant différentes "variables de regroupement" dans le cadre de l'analyse des données, il est possible d'obtenir des résultats plus précis. aes 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 apparaissent.

Dans ce cas, nous pouvons utiliser le colour aessthetics, qui fait correspondre la couleur des lignes aux différents niveaux d'une variable dans l'ensemble de données (ici : y1 vs y2). Mais d'abord, nous devons faire passer les données du format large au format long, en utilisant par exemple la fonction 'melt' de reshape2 paquet. D'autres méthodes pour remodeler les données sont décrites ici : Remodelage de data.frame du format large au format long .

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

18voto

mcabral Points 2716

Si vous utilisez des graphiques de base (c'est-à-dire pas des graphiques en treillis/grilles), vous pouvez imiter la fonction de maintien 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 la fonction par(mfg=...) pour choisir la parcelle à laquelle vous ajoutez des choses.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X