user8261831
user8261831

Reputation: 504

How to plot certain columns in R [xts]?

I have a some data that looks like this: https://i.sstatic.net/TjJ9k.jpg

And I am plotting it using:

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

How do I plot it so that I only include a few variables? E.g. plot the NSW price and coal price against time, rather than plotting every variable against time?

Thanks

Reproducible example:

NSW1.Price Black.Coal Gas Hydro Liquid.Fuel 2011-01-01 30.89336 32.33668 41.63653 69.82661 108.06855 2011-01-08 30.98103 32.24805 41.33295 69.44308 104.36587 2011-01-15 30.73076 32.11497 40.76273 69.59129 97.30812 2011-01-22 30.76028 30.50381 36.56215 62.50329 61.78828 2011-01-29 29.76733 34.65090 43.94289 93.20954 113.42410

Edit2, How I created data:

mydata=read.csv(file="nem_tech_dataTAS.csv") library(xts) library(zoo) date <- seq(from=as.POSIXct("2010-01-01 00:30", format = "%Y-%m-%d %H:%M"), length.out = nrow(mydata), by = "30 min") mydata_dated <- xts(mydata, date) fifty_twoweekmovavg=rollapply(mydata_dated,17520,mean,by = 336,na.pad = FALSE)

Edit3, format of legend:

Current legend:legend1

Desired legend: legend2

Upvotes: 2

Views: 2593

Answers (3)

phiver
phiver

Reputation: 23608

Plotting xts objects can be done with the plot command if package xts has been loaded. For more details on how to plot xts objects, use ?plot.xts.

To select only 2 columns you can use grep inside the xts object.

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")

edit: manipulating the legend, this makes it easier, and will result in the same plot, but with lines for the legend instead of squares:

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)

enter image description here

Upvotes: 1

stok
stok

Reputation: 375

The code below can render a plot with multiple lines with the graph legend.

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))

enter image description here

Upvotes: 0

thequerist
thequerist

Reputation: 1824

If you want to draw two lines that show the Gas and Hydro values over time, you first need to create a time series. Create a column that gets the date and turns it into Date format using as.Date. In your example above, you would write:

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

That gets you your x axis values.

Now in order to get both your Gas and Hydro values you have to make sure that the y axis fits both of them as the values for Gas and Hydro do not intersect.

One way of doing this is by:

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

Once you have your date and extents set, you may finally proceed to plot your lines:

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

Upvotes: 1

Related Questions