本文介绍了如何在一张ggplot中绘制S&amp; P 500和苏富比时间系列?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述 29岁程序员,3月因学历无情被辞! 我正在用quantmod软件包下载S& P 500时间系列和苏富比股票: 库(动物园) library(tseries) library(quantmod) library(ggplot2) env1 = new.env() getSymbols(^ GSPC, env = env1,src =yahoo,from = as.Date(1988-06-01),to = as.Date(2013-05-29)) GSPC = env1 $ GSPC gspc.df = data.frame(date = time(GSPC),coredata(GSPC)) env2 = new.env() getSymbols(BID,env = env2,src =yahoo,from = as.Date(1988-06-01),to = as.Date(2013-05-29)) BID = env2 $ BID sothebys.df = data.frame(date = time(BID),coredata(BID)) 我的目标是将调整后的价格合并或融合在一起,并将其与ggplot一起绘制。然而,我对df框架有问题: t = as.Date(0:9128,origin =1988-06 -01) y1 = gspc.df $ GSPC.Adjusted y2 = sothebys.df $ BID.Adjusted df = data.frame(t = t,values = c(y2,每个= 9129)) $ bg = ggplot(data = df,aes(x = t,y = values))+ geom_line()+ facet_grid(type〜。,scales =free)+ scale_y_continuous(trans =log10)+ ylab(Log values)g 当我尝试执行df = data ...行时,行数。如何融化或合并数据,以便我可以将它们用于组合的ggplot? 编辑 图表正常工作。在最后一步中,我将衰退条添加到图中。以下代码会产生衰退条,包括标准化次数seres: $ $ $ $ $ $ c $ recessions.df = read.table(textConnection(高峰,低谷 1857-06-01,1858-12-01 1860-10-01,1861-06-01 1865-04-01,1867-12-01 1869-06-01,1870-12-01 1873-10-01,1879-03-01 1882-03-01,1885-05-01 1887 -03-01,1888-04-01 1890-07-01,1891-05-01 1893-01-01,1894-06-01 1895-12-01, 1897-06-01 1899-06-01,1900-12-01 1902-09-01,1904-08-01 1907-05-01,1908-06-01 1910-01-01,1912-01-01 1913-01-01,1914-12-01 1918-08-01,1919-03-01 1920 -01-01,1921-07-01 1923-05-01,1924-07-01 1926-10-01,1927-11-01 1929-08-01, 1933-03-01 1937-05-01,1938-06-01 1945-02-01,1945-10-01 1948-11-01,1949-10-01 1953-07-01,1954-05-01 1957-08-01,1958-04-01 1960-04-01,1961-02-01 1969 -12-01,1970-11-01 1973-11 -01,1975-03-01 1980-01-01,1980-07-01 1981-07-01,1982-11-01 1990-07-01,1991- 03-01 2001-03-01,2001-11-01 2007-12-01,2009-06-01),sep =',', colClasses = c( 'Date','Date'),header = TRUE) recessions.trim = subset(recessions.df,Peak> = min(gspc.df $ date)) g。 gspc = ggplot(data = df2)+ geom_line(aes(x = Date,y = GSPC,color =blue))+ geom_line(aes(x = Date,y = Sothebys,color =red))+ theme_bw () g.gspc = g.gspc + geom_rect(data = recessions.trim,aes(xmin = Peak,xmax = Trough,ymin = -Inf,ymax = + Inf),fill ='pink',alpha = 0.4) plot(g.gspc) 非常感谢您的协助/教学。我对编程和R相当陌生,感谢帮助我改进:) 顺便说一句,如果有人有进一步改进此解决方案的想法,请评论! Thx 解决方案苏富比的数据比标准普尔的数据略少。如果您从S& P中删除没有出现在苏富比的日期,那么它可以正常工作。您在定义数据框方面做了一些奇怪的事情,所以我解决了这个问题。 library(zoo) library(tseries) library(quantmod) library(ggplot2) #import env1 = new.env() getSymbols(^ GSPC ,env = env1,src =yahoo,from = as.Date(1988-06-01),to = as.Date(2013-05-29)) GSPC = env1 $ GSPC gspc.df = data.frame(date = time(GSPC),coredata(GSPC)) env2 = new.env() getSymbols(BID, env = env2,src =yahoo,from = as.Date(1988-06-01),to = as.Date(2013-05-29)) BID = env2 $ BID sothebys.df = data.frame(date = time(BID),coredata(BID)) #查找哪些日期在GSPC中,但不在苏富比的 bad.dates< ; - sothebys.df $ date [-which(gspc.df $ date%in%sothebys.df $ date)] #从数据框中删除'坏日期',这样两个股票都有代表性从每个日期观察# gspc.df< - gspc.df [-which(gspc.df $ date%in%bad.dates),] #v erify长度长度(gspc.df)==长度(sothebys.df) #建立数据框,其中包含日期和股票价格以用于图表 df =数据.frame(Date = gspc.df $ date, GSPC = gspc.df $ GSPC.Adjusted, Sothebys = sothebys.df $ BID.Adjusted) #plot价格随时间推移 ggplot(data = df,aes(x = Date))+ geom_line(aes(y = GSPC),color =blue)+ geom_line(aes(y = Sothebys) =红色) 您应该考虑只考虑日常价格变化,这是比较股票时常见的做法。指数和特定证券之间交易量的差异非常大,您无法通过查看您请求的图表学到很多东西。我偶尔会使用标准化函数。这对于这种情况并不完美(它把所有的事情都调整到0到1的范围内),但是我会留给你来正确地标准化你的数据。同时,下面的代码将给你一个他们如何比较的好主意: NormalizeVector< - function(x ){ NormCalc (x - min(x,na.rm = TRUE))/(max(x,na.rm = TRUE) - min(x, na.rm = TRUE))} if(class(x)%in%c(integer,numeric)){ norm.val< - NormCalc(x )} else norm.val< - x return(norm.val)} df2 = as.data.frame(lapply (df,NormalizeVector)) #随时间绘制标准化价格 ggplot(data = df2,aes(x = Date))+ geom_line(aes(y = GSPC),color =蓝色)+ geom_line(aes(y = Sothebys),color =red) I am downloading with the quantmod package the S&P 500 time series and the Sotheby's stock:library(zoo)library(tseries)library(quantmod)library(ggplot2)env1 = new.env()getSymbols("^GSPC", env = env1, src ="yahoo", from = as.Date("1988-06-01"),to = as.Date("2013-05-29"))GSPC = env1$GSPCgspc.df = data.frame(date=time(GSPC), coredata(GSPC))env2 = new.env()getSymbols("BID", env = env2, src ="yahoo", from = as.Date("1988-06-01"),to = as.Date("2013-05-29"))BID = env2$BIDsothebys.df = data.frame(date=time(BID), coredata(BID))My objective is to merge or melt the Adjusted Prices together and plot them with ggplot. However, I have problems with the df frame:t = as.Date(0:9128, origin="1988-06-01")y1 = gspc.df$GSPC.Adjustedy2 = sothebys.df$BID.Adjusteddf = data.frame(t=t, values=c(y2,y1), type=rep(c("Bytes", "Changes"), each=9129))g = ggplot(data=df, aes(x=t, y=values)) + geom_line() + facet_grid(type ~ ., scales="free") + scale_y_continuous(trans="log10") + ylab("Log values")gWhen I try to execute the df = data... line I get an error concerning the number of rows. How can I melt or merge the data, so that I can use them for the combined ggplot?EDITThe graph works fine. In the last step I included the recession bars into the graph. The following code produces the recession bars including the normalized times seres:recessions.df = read.table(textConnection( "Peak, Trough 1857-06-01, 1858-12-01 1860-10-01, 1861-06-01 1865-04-01, 1867-12-01 1869-06-01, 1870-12-01 1873-10-01, 1879-03-01 1882-03-01, 1885-05-01 1887-03-01, 1888-04-01 1890-07-01, 1891-05-01 1893-01-01, 1894-06-01 1895-12-01, 1897-06-01 1899-06-01, 1900-12-01 1902-09-01, 1904-08-01 1907-05-01, 1908-06-01 1910-01-01, 1912-01-01 1913-01-01, 1914-12-01 1918-08-01, 1919-03-01 1920-01-01, 1921-07-01 1923-05-01, 1924-07-01 1926-10-01, 1927-11-01 1929-08-01, 1933-03-01 1937-05-01, 1938-06-01 1945-02-01, 1945-10-01 1948-11-01, 1949-10-01 1953-07-01, 1954-05-01 1957-08-01, 1958-04-01 1960-04-01, 1961-02-01 1969-12-01, 1970-11-01 1973-11-01, 1975-03-01 1980-01-01, 1980-07-01 1981-07-01, 1982-11-01 1990-07-01, 1991-03-01 2001-03-01, 2001-11-01 2007-12-01, 2009-06-01"), sep=',',colClasses=c('Date', 'Date'), header=TRUE)recessions.trim = subset(recessions.df, Peak >= min(gspc.df$date))g.gspc = ggplot(data = df2) + geom_line(aes(x = Date, y = GSPC, colour = "blue")) + geom_line(aes(x = Date, y = Sothebys, colour = "red")) + theme_bw()g.gspc = g.gspc + geom_rect(data=recessions.trim, aes(xmin=Peak, xmax=Trough, ymin=-Inf, ymax=+Inf), fill='pink', alpha=0.4)plot(g.gspc)Thank you very much for your assistance / teaching. I am quite new to programming and R, thanks for helping me to improve :)By the way, if somebody has an idea to further improve this solution, please comment! Thx 解决方案 The data from Sotheby's has slightly fewer observations than the data from the S&P. If you remove the dates from S&P that do not appear in Sotheby's, then it works fine. You were doing some weird things in defining your dataframe as well, so I fixed that.library(zoo)library(tseries)library(quantmod)library(ggplot2)# importenv1 = new.env()getSymbols("^GSPC", env = env1, src ="yahoo", from = as.Date("1988-06-01"),to = as.Date("2013-05-29"))GSPC = env1$GSPCgspc.df = data.frame(date=time(GSPC), coredata(GSPC))env2 = new.env()getSymbols("BID", env = env2, src ="yahoo", from = as.Date("1988-06-01"),to = as.Date("2013-05-29"))BID = env2$BIDsothebys.df = data.frame(date=time(BID), coredata(BID))# find which dates are in GSPC but not in Sotheby'sbad.dates <- sothebys.df$date[-which(gspc.df$date %in% sothebys.df$date)]# remove the 'bad dates' from the dataframe so that both stocks have representative observations# from each dategspc.df <- gspc.df[-which(gspc.df$date %in% bad.dates),]# verify the lengthslength(gspc.df) == length(sothebys.df)# build the dataframe with dates and stock prices to be used in graphingdf = data.frame(Date = gspc.df$date, GSPC = gspc.df$GSPC.Adjusted, Sothebys = sothebys.df$BID.Adjusted)# plot prices over timeggplot(data = df, aes(x = Date)) + geom_line(aes(y = GSPC), colour = "blue") + geom_line(aes(y = Sothebys), colour = "red")You should definitely think about looking at just the day-to-day price changes, which is a common practice when comparing stocks. The difference in trading volume between an index and a particular security is so great that you can't learn much by looking at the chart you requested. I use the normalization function below occasionally. It isn't perfect for this situation (it scales everything to a range of 0 to 1), but I'll leave it up to you to standardize your data properly. In the mean time, the following code will give you a good idea of how they compare:NormalizeVector <- function(x) { NormCalc <- function(x) { (x - min(x, na.rm=TRUE))/(max(x,na.rm=TRUE) - min(x, na.rm=TRUE)) } if (class(x) %in% c("integer", "numeric")) { norm.val <- NormCalc(x) } else norm.val <- x return(norm.val)}df2 = as.data.frame(lapply(df, NormalizeVector))# plot normalized prices over timeggplot(data = df2, aes(x = Date)) + geom_line(aes(y = GSPC), colour = "blue") + geom_line(aes(y = Sothebys), colour = "red") 这篇关于如何在一张ggplot中绘制S&amp; P 500和苏富比时间系列?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持! 上岸,阿里云!
09-02 20:17