Как построить определенные столбцы в R [xts]? - PullRequest
0 голосов
/ 09 января 2019

У меня есть некоторые данные, которые выглядят так: https://imgur.com/a/UK64GCp

И я строю это, используя:

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

Как мне построить так, чтобы я включил только несколько переменных? Например. построить график зависимости цены NSW и угля от времени, а не от зависимости каждой переменной от времени?

Спасибо

Воспроизводимый пример:

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, как я создал данные:

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, формат легенды:

Текущая легенда: legend1

Желаемая легенда: legend2

Ответы [ 3 ]

0 голосов
/ 09 января 2019

Приведенный ниже код может отображать график с несколькими строками с легендой графика.

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

0 голосов
/ 09 января 2019

Создание объектов xts может быть выполнено с помощью команды plot, если пакет xts был загружен. Для получения дополнительной информации о том, как построить объекты XTS, используйте ?plot.xts.

Чтобы выбрать только 2 столбца, вы можете использовать grep внутри объекта xts.

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

редактирование: манипулируя легендой, это облегчает задачу и приводит к тому же сюжету, но с линиями для легенды вместо квадратов:

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

0 голосов
/ 09 января 2019

Если вы хотите нарисовать две линии, которые отображают значения газа и гидро во времени, вам сначала нужно создать временной ряд. Создайте столбец, который получает дату и преобразует ее в формат даты, используя as.Date. В приведенном выше примере вы должны написать:

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

Это даст вам ваши значения оси X.

Теперь, чтобы получить ваши значения Gas и Hydro, вы должны убедиться, что ось y подходит им обоим, поскольку значения для Gas и Hydro не пересекаются.

Один из способов сделать это:

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

После того, как вы установили дату и экстенты, вы можете, наконец, приступить к построению линий:

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