web-dev-qa-db-fra.com

Tracer plusieurs courbes, même graphique et même échelle

Ceci est un suivi de cette question .

Je voulais tracer plusieurs courbes sur le même graphique mais pour que mes nouvelles courbes respectent la même échelle d'axe y générée par la première courbe.

Notez l'exemple suivant:

y1 <- c(100, 200, 300, 400, 500)
y2 <- c(1, 2, 3, 4, 5)
x <- c(1, 2, 3, 4, 5)

# first plot
plot(x, y1)

# second plot
par(new = TRUE)
plot(x, y2, axes = FALSE, xlab = "", ylab = "")

Cela trace en fait les deux ensembles de valeurs sur les mêmes coordonnées du graphique (car je cache le nouvel axe y qui serait créé avec le deuxième tracé).

Ma question est alors de savoir comment conserver la même échelle de l'axe y lors du tracé du deuxième graphique.

20
Renan

(La méthode typique consiste à utiliser plot une seule fois pour définir les limites, éventuellement pour inclure la plage de toutes les séries combinées, puis à utiliser points et lines pour ajoutez la série séparée.) Pour utiliser plot plusieurs fois avec par(new=TRUE), vous devez vous assurer que votre premier tracé a une ylim appropriée pour accepter toutes les séries (et dans une autre situation, vous devrez peut-être également utiliser la même stratégie pour xlim):

# first plot
plot(x, y1, ylim=range(c(y1,y2)))

# second plot  EDIT: needs to have same ylim
par(new = TRUE)
plot(x, y2, ylim=range(c(y1,y2)), axes = FALSE, xlab = "", ylab = "")

enter image description here

Ce code suivant fera la tâche de manière plus compacte, par défaut, vous obtenez des nombres sous forme de points mais le second vous donne des "points" de type R typiques:

  matplot(x, cbind(y1,y2))
  matplot(x, cbind(y1,y2), pch=1)
34
42-

points ou lines est utile si

  • y2 est généré ultérieurement, ou
  • les nouvelles données n'ont pas le même x mais doivent toujours aller dans le même système de coordonnées.

Comme vos y partagent le même x, vous pouvez également utiliser matplot:

matplot (x, cbind (y1, y2), pch = 19)

matplot (x, cbind (y1, y2), pch = 19)

(sans pchmatplopt tracera les numéros de colonne de la matrice y au lieu de points).

6
cbeleites

Vous n'êtes pas très clair sur ce que vous voulez ici, car je pense que @ DWin est techniquement correct, compte tenu de votre exemple de code. Je pense que ce que vous vraiment voulez est ceci:

y1 <- c(100, 200, 300, 400, 500)
y2 <- c(1, 2, 3, 4, 5)
x <- c(1, 2, 3, 4, 5)

# first plot
plot(x, y1,ylim = range(c(y1,y2)))

# Add points
points(x, y2)

La solution de DWin fonctionnait sous l'hypothèse implicite (basée sur votre exemple de code) que vous vouliez tracer le deuxième ensemble de points superposé sur l'échelle d'origine. C'est pourquoi son image semble que les points sont tracés à 1, 101, etc. Appeler plot une deuxième fois n'est pas ce que vous voulez, vous voulez ajouter au tracé en utilisant points. Le code ci-dessus sur ma machine produit donc ceci:

enter image description here

Mais le point principal de DWin sur l'utilisation de ylim est correct.

5
joran

Ma solution consiste à utiliser ggplot2. Il s'occupe automatiquement de ce type de choses. Le plus important est d'organiser les données de manière appropriée.

y1 <- c(100, 200, 300, 400, 500)
y2 <- c(1, 2, 3, 4, 5)
x <- c(1, 2, 3, 4, 5)
df <- data.frame(x=rep(x,2), y=c(y1, y2), class=c(rep("y1", 5), rep("y2", 5)))

Utilisez ensuite ggplot2 pour le tracer

library(ggplot2)
ggplot(df, aes(x=x, y=y, color=class)) + geom_point()

Cela signifie tracer les données dans df et séparer les points par class.

Le tracé généré estenter image description here

3
rmflight

Je ne sais pas ce que vous voulez, mais j'utiliserai un treillis.

x = rep(x,2)
y = c(y1,y2)
fac.data = as.factor(rep(1:2,each=5))
df = data.frame(x=x,y=y,z=fac.data)
# this create a data frame where I have a factor variable, z, that tells me which data I have (y1 or y2)

Ensuite, il suffit de tracer

xyplot(y ~x|z, df)
# or maybe
xyplot(x ~y|z, df)
1
Manoel Galdino