R语言绘制股票价格图时图例不显示的问题求助
解决R语言绘制股票价格图时图例不显示的问题
嘿,我明白你现在遇到的问题了——用R画股票走势图时明明指定了图例参数却不显示,确实挺让人头疼的,尤其是刚接触R的时候。我来帮你排查一下原因,再给你两种解决办法~
问题根源
你用getSymbols.yahoo()获取的portfolioPrices是xts/zoo类型的时间序列对象,当你调用plot()时,实际执行的是plot.zoo函数(xts继承自zoo)。这个函数的legend参数和基础绘图的legend用法不一样,直接传tickers并不会生效,得用专门的方法添加图例。
另外提个小细节:你代码里的FB现在已经改名为META了,继续用FB可能会获取不到数据,我后面的代码会改成META哦。
方案一:用quantmod自带的addLegend()函数
这是最贴合你原有代码的修改方式,只需要在plot()之后调用addLegend()手动添加图例:
library(quantmod) library(dplyr) library(PerformanceAnalytics) # 更新股票代码,FB已改为META tickers <- c("AAPL", "AMZN" , "MSFT" ,"META") portfolioPrices <- NULL for (Ticker in tickers) { portfolioPrices <- cbind(portfolioPrices, # 获取每周的调整收盘价(第4列) getSymbols.yahoo(Ticker, from="2017-01-01", periodicity = "weekly", auto.assign=FALSE)[,4]) } # 移除含NA的行 portfolioPrices <- portfolioPrices[apply(portfolioPrices,1,function(x) all(!is.na(x))),] colnames(portfolioPrices) <- tickers # 绘制原始价格图,之后添加图例 plot(portfolioPrices) # 指定图例位置、名称、线条样式和颜色 addLegend("topright", legend.names = tickers, lty = 1, col = 1:length(tickers)) # 绘制标准化后的数据图,同样添加图例 scaledData <- scale(portfolioPrices) plot(scaledData) addLegend("topright", legend.names = tickers, lty = 1, col = 1:length(tickers))
addLegend()的参数说明:
"topright":图例放置的位置(还可以选"topleft"、"bottomright"等)legend.names:图例显示的名称,就是你的股票代码lty = 1:指定线条为实线(和plot默认样式一致)col = 1:length(tickers):给每个股票分配不同的颜色,和绘图时的颜色对应
方案二:用ggplot2绘制(更适合新手,样式更灵活)
如果你觉得quantmod的绘图逻辑有点绕,推荐用ggplot2包——它的语法更直观,还能自动生成图例,非常适合新手:
library(quantmod) library(dplyr) library(tidyr) # 用来转换数据格式 library(ggplot2) tickers <- c("AAPL", "AMZN" , "MSFT" ,"META") portfolioPrices <- NULL for (Ticker in tickers) { portfolioPrices <- cbind(portfolioPrices, getSymbols.yahoo(Ticker, from="2017-01-01", periodicity = "weekly", auto.assign=FALSE)[,4]) } portfolioPrices <- portfolioPrices[apply(portfolioPrices,1,function(x) all(!is.na(x))),] colnames(portfolioPrices) <- tickers # 把xts时间序列转成ggplot能识别的长格式数据框 portfolio_df <- as.data.frame(portfolioPrices) %>% mutate(Date = index(portfolioPrices)) %>% # 提取日期列 pivot_longer(cols = -Date, names_to = "Ticker", values_to = "Price") # 转成长格式 # 绘制原始价格图 ggplot(portfolio_df, aes(x = Date, y = Price, color = Ticker)) + geom_line() + # 绘制折线 labs(title = "Weekly Stock Adjusted Prices", x = "Date", y = "Adjusted Price") + # 添加标题和坐标轴标签 theme_minimal() # 用简洁的主题 # 处理标准化数据并绘图 scaledData <- scale(portfolioPrices) scaled_df <- as.data.frame(scaledData) %>% mutate(Date = index(scaledData)) %>% pivot_longer(cols = -Date, names_to = "Ticker", values_to = "Scaled_Price") ggplot(scaled_df, aes(x = Date, y = Scaled_Price, color = Ticker)) + geom_line() + labs(title = "Scaled Weekly Stock Prices", x = "Date", y = "Scaled Price") + theme_minimal()
这种方法的优势是:ggplot会自动根据color = Ticker生成图例,你还能轻松调整图表的颜色、字体、主题等样式,后续修改起来更方便。
内容的提问来源于stack exchange,提问作者Sidharth Singh
相关产品推荐
相关产品推荐

