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.
(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 = "")
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)
points
ou lines
est utile si
y2
est généré ultérieurement, oux
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)
(sans pch
matplopt
tracera les numéros de colonne de la matrice y
au lieu de points).
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:
Mais le point principal de DWin sur l'utilisation de ylim
est correct.
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é est
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)