You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:39:40