如何在图像上叠加绘图?预测图叠加图片的代码问题求助
在图像上叠加绘图的方法&你的代码问题修复
嘿,我来帮你搞定这两个问题:先讲通用的图像叠加绘图方法,再帮你修正代码里的错误~
一、通用方法:在图像上叠加绘图
要实现图像和绘图元素的叠加,核心是让两者共享同一套坐标系统,步骤大概是这样:
- 先读取目标图像(比如用
jpeg包的readJPEG,如果是PNG就用png包的readPNG)
- 先读取目标图像(比如用
- 创建绘图区域:要么先画好基础图(比如你的预测图),要么手动设置匹配数据范围的坐标
- 用
rasterImage()把图像放到绘图区,指定好对应的坐标位置(比如覆盖整个区域,或者放在角落)
- 用
- 叠加绘图元素(线条、点、文本等),确保这些元素的坐标和图像所在的坐标系统一致
二、你的代码问题修复
看了你的代码,有几个明显的小问题导致无法正常运行,我帮你逐一修正:
问题1:函数名写错了
R里绘制线条的函数是lines(),不是line()——这是最直接的语法错误。
问题2:坐标获取时机不对
你在plot.new()之后调用par()拿usr坐标,但plot.new()创建的是空绘图区,默认坐标是c(0,1,0,1),这会导致你的图像和预测线的坐标完全不匹配。应该先绘制预测图,再去获取当前的绘图坐标。
问题3:forecast对象的绘图方式不对
直接用lines()去画fit.forecast这个forecast类对象是没用的,得提取里面的具体数据(比如预测均值fit.forecast$mean)来绘制。
下面是两种修正后的方案,对应你不同的需求:
方案1:在预测图上叠加图片(符合你说的“在预测图上叠加一张图片”)
library(quantmod) library(forecast) # 别漏了加载这个包,auto.arima和forecast都依赖它 library(jpeg) # 获取股票数据并生成预测 Stock_df <- as.data.frame(getSymbols(Symbols = "AAPL", src = "yahoo", from = "2017-05-06", env = NULL)) fit <- auto.arima(Stock_df$AAPL.Close, ic="bic") fit.forecast <- forecast(fit) # 读取图片(确保图片在当前工作目录,或者用完整路径) my_image <- readJPEG("Myimage.jpg") # 先绘制预测图作为基础 plot(fit.forecast, main = "AAPL Forecast with Overlaid Image") # 获取当前绘图区的坐标范围 lim <- par("usr") # 设置图片的位置(这里放在右上角,你可以自己调整坐标) # 比如让图片占据x轴右侧1/5,y轴上方1/3的区域 img_x_start <- lim[2] - (lim[2] - lim[1])/5 img_x_end <- lim[2] img_y_start <- lim[4] - (lim[4] - lim[3])/3 img_y_end <- lim[4] # 叠加图片 rasterImage(my_image, img_x_start, img_y_start, img_x_end, img_y_end)
方案2:在图片背景上叠加预测线
如果你是想把预测线画在图片上面,那可以这么写:
library(quantmod) library(forecast) library(jpeg) Stock_df <- as.data.frame(getSymbols(Symbols = "AAPL", src = "yahoo", from = "2017-05-06", env = NULL)) fit <- auto.arima(Stock_df$AAPL.Close, ic="bic") fit.forecast <- forecast(fit) my_image <- readJPEG("Myimage.jpg") # 创建匹配股票数据的绘图区(先不画内容,只搭框架) plot(Stock_df$AAPL.Close, type = "n", main = "AAPL Forecast on Image Background") # 获取坐标,把图片铺满整个绘图区当背景 lim <- par("usr") rasterImage(my_image, lim[1], lim[3], lim[2], lim[4]) # 叠加原始收盘价和预测线 lines(Stock_df$AAPL.Close, col = "darkblue", lwd = 2) lines(fit.forecast$mean, col = "firebrick", lwd = 2, lty = 2) # 可选:添加95%预测区间 lines(fit.forecast$lower[,2], col = "firebrick", lty = 3) lines(fit.forecast$upper[,2], col = "firebrick", lty = 3)
小提示
- 如果你不知道怎么调整图片位置,可以用
locator(1)函数,运行后点击绘图区的某个位置,R会返回该点的坐标,直接拿来用就行 - 检查图片路径是否正确:可以用
getwd()查看当前工作目录,把图片放到这个目录里,或者用完整路径比如readJPEG("C:/Users/xxx/Myimage.jpg")
内容的提问来源于stack exchange,提问作者Cricketer
相关产品推荐
相关产品推荐

