绘制不同变量的概率分布

时间:2015-10-08 18:14:13

标签: r plot histogram lines

我的数据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函数绘制概率分布与不同变量的概率密度线。

2 个答案:

答案 0 :(得分:0)

我会使用一些quantmod和ggplot2包来完成这项任务。如果您的问题特别针对histsapply

,请忽略此问题
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)

enter image description here

或者如果你想要直方图

m <- ggplot(d, aes(x=close, colour=symbol, group=symbol))
m + geom_histogram(fill=NA,position='dodge')

enter image description here

答案 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~.)