R语言绘制股票收益图时图例不显示问题求助
解决quantmod绘图时图例不显示的问题
我之前也遇到过一模一样的问题!quantmod基于xts对象的绘图系统和R基础绘图的legend()函数兼容性不太好,主要是因为plot.xts会自定义绘图区域的坐标规则,导致基础legend()找不到正确的位置渲染。下面针对你两种绘图方式分别给出解决方案:
方案1:针对多列xts对象的单屏绘图
你第一个代码里用plot(x=portfolio, screens=1)直接绘制多列xts,这时候别用基础的legend(),改用quantmod自带的addLegend()函数,它能完美适配xts的绘图环境:
library(quantmod) library(TTR) tckrs<-c("GOOG","FB") getSymbols(tckrs,from="2019-01-01") AdG<-Ad(GOOG) AdF<-Ad(FB) DrG<-dailyReturn(AdG)[-1,] DrF<-dailyReturn(AdF)[-1,] portfolio<-cbind(DrG,DrF) colnames(portfolio) names(portfolio)[1]<="DrG" names(portfolio)[2]<="DrF" tsRainbow<-rainbow(ncol(portfolio)) plot(x=portfolio,ylab="Return",main="Portfolio Returns (Single)",col=tsRainbow,screens=1) # 替换原legend为addLegend addLegend("bottom", legend.names = c("GOOG","FB"), lty=1, col=tsRainbow, on=1)
这里的on=1指定图例添加到第1个屏幕(你这里只有一个屏幕,也可以省略,但加上更稳妥)。
方案2:先绘制单个xts再用lines叠加
你第二个代码里先画DrG再叠加DrF,这时候有两种解决方式:
方式A:继续用基础legend,但调整inset参数
基础legend()的字符串位置(比如"bottom")在xts绘图里可能被坐标轴遮挡,调整inset参数让它稍微上移一点:
myColors<-c("red","darkgreen") plot(x=portfolio[,"DrG"],xlab="Time",ylab="Stock Returns",main="Stock Returns",ylim=c(-0.15,0.1),major.ticks= "years",minor.ticks=FALSE,col="red") lines(x=portfolio[,"DrF"],col="darkgreen") legend(x="bottom",legend=c("DrG","DrF"),lty=1,col=myColors, inset=c(0, 0.02))
方式B:用quantmod的addLegend更省心
直接调用addLegend(),它会自动识别当前的xts绘图区域:
myColors<-c("red","darkgreen") plot(x=portfolio[,"DrG"],xlab="Time",ylab="Stock Returns",main="Stock Returns",ylim=c(-0.15,0.1),major.ticks= "years",minor.ticks=FALSE,col="red") lines(x=portfolio[,"DrF"],col="darkgreen") addLegend("bottom", legend.names = c("DrG","DrF"), lty=1, col=myColors)
为什么原代码的legend不显示?
核心原因是plot.xts(quantmod绘图的底层函数)会重新设置绘图的坐标系统和边距,基础legend()函数的位置计算是基于标准基础绘图的坐标,和xts的绘图区域不匹配,导致图例被绘制到了可见区域之外,所以你看不到它。而addLegend()是quantmod专门为xts绘图开发的,会自动适配这些自定义的绘图参数,所以能正常显示。
内容的提问来源于stack exchange,提问作者amatS
相关产品推荐
相关产品推荐

