2017-04-27 131 views
0

我一直收到一个错误,因为条形图用于四位数据,并且该行将成为整年的数据,所以它会有很多点。我想使用geom_line在ggplot中的四个条形图上绘制一条线。

唯一的问题是我使用geom_line函数。该错误是 - 在scale_fill_manual>

错误(值= C( “绿色”, “黄色”))+ geom_line(AES(X = DTS2,:非数值参数为二进制运算符

t="DG" 
fin=getFinancials(t, auto.assign = F) 
dts = labels(fin$BS$A)[[2]] 
dts2 = paste(substr(dts,1,7),"::",dts, sep="") 
stockprices = getSymbols(t, auto.assign = F) 
price = rep(0,NROW(dts)) 
for(i in 1:NROW(price)) 
{ 
    price[i]=as.vector(last(stockprices[dts2[i],6])) 
} 

yr= as.numeric(substr(dts,1,4)) 
pastyr = yr -2 
betayr = paste(pastyr,"::",yr,sep="") 

os = fin$BS$A["Total Common Shares Outstanding", ] 
gw= fin$BS$A["Goodwill, Net", ] 
ta= fin$BS$A["Total Assets", ] 
td= fin$BS$A["Total Debt", ] 
ni= fin$IS$A["Net Income", ] 
btax = fin$IS$A["Income Before Tax", ] 
atax = fin$IS$A["Income After Tax",] 

intpaid = fin$CF$A["Cash Interest Paid, Supplemental",] 
gw[is.na(gw)]=0 
intpaid[is.na(intpaid)]=0 
taa = (ta - gw)/os 

Rd = rep(0,NROW(dts)) 

for(i in 1:NROW(dts)) 
{ 
    if(td[i]!=0) 
    { 
    Rd[i] = intpaid[i]/td[i] 
    } 
} 


gspc = getSymbols("^GSPC", auto.assign = F) 
gs5 = getSymbols("GS5", src = "FRED", auto.assign = F) 

marketRisk = rep(0,NROW(dts)) 
riskFree = rep(0,NROW(dts)) 
beta = rep(0,NROW(dts)) 

for(i in 1:NROW(dts)) 
{ 
marketRisk[i]= mean(yearlyReturn(gspc[betayr[i]])) 
riskFree[i] = mean(gs5[betayr[i]]) 
gspc.weekly = weeklyReturn(gspc[betayr[i]]) 

stockprices.weekly = weeklyReturn(stockprices[betayr[i]]) 
beta[i] = CAPM.beta(stockprices.weekly,gspc.weekly) 
} 

Re = (riskFree/100) + beta * (marketRisk-(riskFree/100)) 

E = os*price 
V=E+td 
Tc = (btax - atax)/btax 
wacc = (E/V)*Re + (td/V)*Rd*(1-Tc) 
margin = (ni/wacc)/os - taa 

taadf = data.frame(dts,val = taa,cat="ta") 
margindf = data.frame(dts,val = margin ,cat="margin") 

mdf=rbind(margindf,taadf) 

#linrng = paste(dts[NROW(dts)],"::",dts[1],sep="") 

#dfdt = data.frame(stockprices[linrng,6]) 
#dfdt2 = data.frame(dt = labels(dfdt)[[1]],dfdt$AAPL.Adjusted,cat="taa") 
#names(dfdt2)=c("dt,price,cat") 
pricedf = data.frame(as.vector((stockprices[dts2[i],6]))) 
ggplot(mdf, aes(x=dts,y=val,fill=cat)) + geom_bar(stat="identity",color="black") 
    scale_fill_manual(values = c("green","yellow")) + 
    geom_line(aes(x=dts2, y=stockprices), stat = "identity", 
    position = "identity", na.rm = FALSE, show.legend = NA, 
    inherit.aes = TRUE) 
+0

非数字转二进制表明,当你粘贴'dts2'时,它变成了一个字符变量,并且线条图似乎期望一个数值与条形图中'dts'的x轴相匹配。如果可能,尝试将其转换为数字(我无法看到真正的数据或'str()'知道肯定) – sconfluentus

回答

0

注意,对象stockpricesAn ‘xts’ object。所以,你不能ggplot规模内使用,我挑stockprices对象的拳头变量显示代码,但你probabli想要一个又一个。

library(dplyr) 
library(quantmod) 
library(PerformanceAnalytics) 
library(ggplot2) 

stockprices_df <- as.data.frame(stockprices) %>% 
    mutate(date = rownames(.)) %>% 
    filter(date %in% dts) 

ggplot() + 
    geom_col(
    data = mdf, 
    aes(x = dts,y = val,fill = cat) 
) + 
    geom_line(
    data = stockprices_df, 
    aes(x = date, y = DG.Open, group = 1) 
) + 
    scale_fill_manual(values = c("green","yellow")) 

[1]