Une question très nouvelle, mais disons que j'ai des données comme celle-ci:
test_data <-
data.frame(
var0 = 100 + c(0, cumsum(runif(49, -20, 20))),
var1 = 150 + c(0, cumsum(runif(49, -10, 10))),
date = seq(as.Date("2002-01-01"), by="1 month", length.out=100)
)
Comment puis-je tracer les deux séries chronologiques var0
et var1
sur le même graphique, avec date
sur l'axe des x, en utilisant ggplot2
? Des points bonus si vous faites var0
et var1
des couleurs différentes, et peuvent inclure une légende!
Je suis sûr que c'est très simple, mais je ne trouve aucun exemple là-bas.
colour=
comme nom de variable.colour='var_names'
comme spécifié par hadley fonctionne très bien. mais @DaveX - serait plus spécifique si l'on veut choisir des couleurs spécifiques plutôt que des couleurs sélectionnées automatiquement par la fonction.L'approche générale consiste à convertir les données au format long (à l'aide
melt()
du packagereshape
oureshape2
) ougather()
/pivot_longer()
dutidyr
package:Voir également cette question sur le remodelage des données de large à long.
la source
gather()
fonction detidyr
package pour faire fondre les données:gather(test_data, variable, value, -date)
Vous avez besoin que les données soient au format "grand" au lieu de "large" pour ggplot2. "large" signifie avoir une observation par ligne avec chaque variable comme une colonne différente (comme vous l'avez maintenant). Vous devez le convertir dans un format "grand" où vous avez une colonne qui vous indique le nom de la variable et une autre colonne qui vous indique la valeur de la variable. Le processus de passage du large au grand est généralement appelé «fusion». Vous pouvez utiliser
tidyr::gather
pour faire fondre votre bloc de données:Juste pour être clair, ce
data
quiggplot
est consommé après l'avoir canalisé viagather
ressemble à ceci:la source
Utilisation de vos données:
Je crée une version empilée avec laquelle
ggplot()
j'aimerais travailler:Dans ce cas, la production a
stacked
été assez facile car nous n'avons eu à effectuer que quelques manipulations, maisreshape()
lereshape
etreshape2
pourrait être utile si vous avez un ensemble de données réelles plus complexe à manipuler.Une fois que les données sont sous cette forme empilée, il suffit d'un simple
ggplot()
appel pour produire le tracé que vous vouliez avec tous les extras (une des raisons pour lesquelles les packages de traçage de niveau supérieur aimentlattice
etggplot2
sont si utiles):Je vous laisse le soin de ranger les étiquettes des axes, le titre de la légende, etc.
HTH
la source
rep()
, donc nous ne recevons vraiment que 3 colonnesstacked
. Je vais modifier le code pour rendre le retrait plus clair.melt()
est bien pris et je note que le package de remodelage [2] serait utile ici. Je ne suis pas très familier avec reshape2 et pour une manipulation aussi simple, le faire à la main est plus complexe qu'un appel àmelt()
, c'était moins d'effort car je n'avais pas besoin de lire comment l'utilisermelt()
. Et rcs s'est faufilé avec sa réponse pendant que je produisais la mienne; lorsque j'ai commencé la réponse, il n'y avait eu aucune réponse. plus d'une façon d'écorcher un chat - comme on dit! ;-)Je suis également nouveau sur R, mais en essayant de comprendre comment fonctionne ggplot, je pense que je peux faire autrement. Je partage juste probablement pas comme une solution parfaite complète mais pour ajouter des points de vue différents.
Je sais que ggplot est conçu pour mieux fonctionner avec les trames de données, mais il peut également être parfois utile de savoir que vous pouvez tracer directement deux vecteurs sans utiliser de trame de données.
Chargement des données. La longueur du vecteur de date d'origine est de 100 tandis que var0 et var1 ont une longueur de 50, donc je ne trace que les données disponibles (les 50 premières dates).
Traçage
Cependant, je n'ai pas pu ajouter une légende correcte en utilisant ce format. Est-ce que quelqu'un sait comment?
la source
ggplot() + geom_line(aes(x=date,y=var0, group=1, colour = 'red')) + geom_line(aes(x=date,y=var1, group = 2, colour = 'blue')) + ylab('Values')+xlab('date')