1
votes

Comment tracer certaines colonnes dans R [xts]?

J'ai quelques données qui ressemblent à ceci: https://imgur.com/a/UK64GCp

Et je le trace en utilisant:

plot(fifty_twoweekmovavg)
pdf("52_week_moving_average_chartNSW.pdf",onefile=TRUE)
addLegend("topleft",lty = 1,cex=1.2)
dev.off()

Comment puis-je le tracer de manière à n'inclure que quelques variables? Par exemple. tracer le prix NSW et le prix du charbon en fonction du temps, plutôt que de tracer chaque variable en fonction du temps?

Merci

Exemple reproductible:

NSW1.Prix Noir.Coal Gas Hydro Liquid.Fuel 01/01/2011 30.89336 32.33668 41.63653 69.82661 108.06855 08/01/2011 30.98103 32.24805 41.33295 69.44308 104.36587 15/01/2011 30.73076 32.11497 40.76273 69.59129 97.30812 22/01/2011 30,76028 30,50381 36,56215 62,50329 61,78828 29/01/2011 29.76733 34.65090 43.94289 93.20954 113.42410

Edit2, Comment j'ai créé des données:

mydata = read.csv (fichier = "nem_tech_dataTAS.csv") bibliothèque (xts) bibliothèque (zoo) date

Edit3, format de la légende:

Légende actuelle: legend1

Légende souhaitée:  legend2


8 commentaires

essayez d'utiliser ggplot pour le traçage


tracé (cinquante_twoweekmovavg $ Gas, cinquante_twoweekmovavg $ Hydro)


Quand je fais cela, il ne trace que les données de gaz et non les données d'hydro?


Avez-vous regardé les fonctions lines ou matplot ?


J'ai essayé des lignes, mais je n'arrive pas à le faire fonctionner avec ma légende? Pourrais-tu m'aider


pdf doit être avant plot . Jetez également un œil à Comment faire un excellent R exemple reproductible , il nous aidera à vous aider tous.


Exemple reproductible en question maintenant (je l'ai édité).


Probablement bon de mentionner que mes données sont un objet 'xts'


3 Réponses :


1
votes

Si vous souhaitez tracer deux lignes qui montrent les valeurs de gaz et d'hydro au fil du temps, vous devez d'abord créer une série chronologique. Créez une colonne qui récupère la date et la transforme au format Date en utilisant as.Date . Dans votre exemple ci-dessus, vous écririez:

plot(fifty_twoweekmovavg$date,fifty_twoweekmovavg$Gas,type='l',ylim=extents)
lines(fifty_twoweekmovavg$date,fifty_twoweekmovavg$Hydro,col='red')

Cela vous donne les valeurs de votre axe x.

Maintenant, pour obtenir à la fois vos valeurs de gaz et d'hydro, vous devez faire assurez-vous que l'axe des y correspond aux deux car les valeurs de Gaz et d'Hydro ne se croisent pas.

Une façon de procéder est de:

extents=range(c(fifty_twoweekmovavg$Gas,fifty_twoweekmovavg$Hydro))

Une fois que vous avez défini votre date et votre étendue, vous pouvez enfin tracer vos lignes:

fifty_twoweekmovavg$date=as.Date(rownames(fifty_twoweekmovavg))


6 commentaires

merci mais quand je fais votre première ligne, j'obtiens ceci: > cinquante_twoweekmovavg $ date = as.Date (rownames (cinquante_twoweekmovav‌ g)) Erreur dans as.Date.default (x, ...): ne sais pas comment pour convertir 'x' en classe "Date"


Pouvez-vous essayer str (cinquante_twoweekmovavg) et copier et coller ce que vous obtenez.


Un objet 'xts' du 2011-01-01 / 2018-12-29 contenant: Data: num [1: 418, 1: 6] 30.9 30.9 30.7 30.6 30.6 ... - attr (*, "dimnames" ) = Liste de 2 .. $: NULL .. $: chr [1: 6] "TAS1.Price" "Gas" "Hydro" "Liquid.Fuel" ... Indexé par objets de classe: [POSIXct, POSIXt] Attributs TZ: xts: NULL


Ah, pouvez-vous montrer le code que vous avez utilisé pour créer l'objet XTS? Cette question peut vous être utile.


oui c'est dans la question originale maintenant


Essayez ceci: cinquante_twoweekmovavg_xts = cinquante_twoweekmovavg puis cinquante_twoweekmovavg = data.frame (date = index (cinquante_twoweekmovav‌ g), cinquante_twoweekmovavg, row.names = NULL) . Vous aurez toujours votre ancien objet XTS mais cela vous permettra de tracer en base à l'aide d'un bloc de données. Si vous voulez vraiment tracer l'objet XTS, regardez dans plot.zoo. Voici un exemple .



0
votes

Le code ci-dessous peut rendre un tracé avec plusieurs lignes avec la légende du graphique.

df2 = data.frame(matrix(data=c(
30.89336,   32.33668, 41.63653,  69.82661,   108.06855,
30.98103,   32.24805, 41.33295,  69.44308,   104.36587,
30.73076,   32.11497, 40.76273,  69.59129,    97.30812,
30.76028,   30.50381, 36.56215,  62.50329,    61.78828,
29.76733,   34.65090, 43.94289,  93.20954,   113.42410
), ncol = 5, byrow = TRUE ))
colnames(df2) = c("NSW1.Price", "Black.Coal", "Gas", "Hydro", "Liquid.Fuel")
df1 = data.frame("time" = as.Date(
      c("2011-01-01",   
        "2011-01-08",   
        "2011-01-15",   
        "2011-01-22",   
        "2011-01-29"),"%Y-%m-%d"))
df = cbind(df1, df2)
plot(0, cex=0, xlim=range(df$time), 
     ylim=c(0,max(c(df$NSW1.Price, df$Black.Coal))))
lines(df$time, df$NSW1.Price, col="cyan", lty = 1)
lines(df$time, df$Black.Coal, col="black", lty=2)
legend("bottomleft", legend = c("NSW1.Price", "Black.Coal"), 
       col = c("cyan", "black"), lty = c(1,2))

entrez la description de l'image ici


0 commentaires

1
votes

Le traçage des objets xts peut être fait avec la commande plot si le package xts a été chargé. Pour plus de détails sur la façon de tracer des objets xts, utilisez ? Plot.xts .

Pour sélectionner seulement 2 colonnes, vous pouvez utiliser grep à l'intérieur de l'objet xts.

plot(fifty_twoweekmovavg[, grep("NSW1|Coal", names(fifty_twoweekmovavg))],
     main = "52_week_moving_average")

# on = 1 is for main plot. lty is for showing a line in the legend.
# see ?addLegend and ?legend
addLegend("topleft", on = 1, lty=1)

modifier: manipuler la légende, cela facilite les choses et aboutira au même tracé, mais avec des lignes pour la légende au lieu de carrés:

library(xts)

plot(fifty_twoweekmovavg[, grep("NSW1|Coal", names(fifty_twoweekmovavg))],
     legend(grep("NSW1|Coal", names(fifty_twoweekmovavg))),
     main = "52_week_moving_average",
     legend.loc = "topleft")

 entrez la description de l'image ici


3 commentaires

Oh super, je vais essayer ça


Fonctionne parfaitement merci, même si je ne comprends pas complètement comment fonctionne "grep"


Une chose mineure, mais j'aimerais y remédier si je peux, c'est le format de la légende. En utilisant votre code, ma légende a une case indiquant chaque couleur, où à l'origine j'avais une ligne indiquant chaque couleur. J'ai édité ma question ci-dessus pour illustrer cela. Comment mettre en forme la légende avec le format de ligne plutôt que le format de votre boîte? Merci!