我的数据ret包括每个变量的3个变量和208行。
dim(ret)
[1] 208 3
我为不同的变量逐一绘制情节。
hist(ret$AAPL,breaks
freq=F,
main="The probaility distribution of AAPL",
xlab="AAPL")
hist(ret$GOOGL,breaks
freq=F,
main="The probaility distribution of GOOGL",
xlab="GOOGL")
hist(ret$WMT,breaks
freq=F,
main="The probaility distribution of WMT",
xlab="WMT")
现在,我尝试使用sapply函数一次分别绘制变量。
sapply(ret, function(x) hist(x,breaks=100,
freq=F,
main="the probaility distribution of x",
xlab="x"))
然而,“main =”x“”和“xlab = x”的概率分布不起作用。我尝试将colnames放在x中。
此外,我还尝试将该行与变量一起放在图中。我使用的功能是
lines(density(,main="",lty=1,lwd=1)
如果我与变量分开绘图,我会
hist(ret$AAPL,breaks
freq=F,
main="the probaility distribution of AAPL",
xlab="AAPL")
lines(density(ret$AAPL),main="AAPL",lty=1,lwd=1)
但是如何使用sapply函数一起做呢? 有人可以告诉我如何解决问题: 使用sapply函数绘制概率分布与不同变量的概率密度线。
答案 0 :(得分:0)
我会使用一些quantmod和ggplot2包来完成这项任务。如果您的问题特别针对hist
和sapply
。
library(ggplot2) # to access round_any
library(quantmod)
getSymbols(c("AAPL","GOOGL","WMT"))
A=data.frame('aapl',AAPL$AAPL.Close)
G=data.frame('goog',GOOGL$GOOGL.Close)
M=data.frame('wmt',WMT$WMT.Close)
names(A)=names(G)=names(M)=c('symbol','close')
d=rbind(A,G,M)
m <- ggplot(d, aes(x=close, colour=symbol, group=symbol))
m + geom_density(fill=NA)
或者如果你想要直方图
m <- ggplot(d, aes(x=close, colour=symbol, group=symbol))
m + geom_histogram(fill=NA,position='dodge')
答案 1 :(得分:0)
这样的东西?我假设你的data.frame ret
有退货,而不是价格,但基本方法应该适用于任何一种情况。
# set up example - you have this already...
library(quantmod) # for getSymbols
symbols <- c("AAPL", "GOOG", "WMT")
ret <- do.call(merge,lapply(symbols,function(s)dailyReturn(Cl(getSymbols(s,src="google",auto.assign=FALSE)))))
names(ret) <- symbols
ret <- data.frame(date=index(ret), ret)
# you start here...
plot.hist <- function(x,s) {
hist(x,breaks=100,freq=F,xlab=s,main=paste("Histogram of",s), xlim=0.1*c(-1,1))
lines(density(x, na.rm=TRUE),lty=1,lwd=1)
}
par(mfrow=c(3,1))
mapply(plot.hist, ret[,2:4], symbols)
这里有一些细微差别。
首先,您需要标题中的股票代码,而不是字符串“x”。为此,您需要使用上述paste(...)
。
其次,在data.frame上使用sapply(...)
时,列确实传递给函数,但列名不是。所以我们必须通过这两个。最简单的方法是使用mapply(...)
(阅读文档)。
最后,正如其他答案所指出的那样,你确实可以使用ggplot,我也建议:
library(ggplot2)
library(reshape2) # for melt(...)
gg.df <- melt(ret, id="date", variable.name="Stock", value.name="Return")
ggplot(gg.df, aes(x=Return))+
geom_histogram(aes(y=..density.., fill=Stock),color="grey80",binwidth=0.005)+
stat_density(geom="line")+
facet_grid(Stock~.)