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

R中saveWidget导出plotly图表为HTML时报options参数错误

报错原因

你这个报错本质是base R绘图语法和plotly语法完全混用+函数错用,传给saveWidget的配置列表里存在大量未命名参数、空参数,触发了参数合法性校验。

  • 你代码里写的mtext()、axis()、abline()、pch、cex、axes、ylim全是R原生基础绘图的函数和参数,plotly不认这些。你把这些函数调用直接塞给layout()当参数,相当于传了一堆没有对应参数名的返回值,直接破坏了layout要求的命名列表格式。
  • 代码里axis(2, at=, cex.axis = 1.1)、axis(4, at=, cex.axis = 1.1)存在明显语法错误,at=后面没有填任何值,空参数传入必然导致参数列表非法。
  • ggplotly()的作用是把ggplot2生成的图表对象转成plotly交互对象,你前面是用plot_ly()直接生成的原生plotly对象,根本不需要套ggplotly(),套了之后会出现对象解析错误。
  • 绘图映射写错:你构造的数据集里列名是Pertubation,写映射的时候写的y = ~res,res在你贴的代码里根本没有定义,运行时会找不到对象。
  • 颜色值格式错误:plot_bgcolor = "fffff"是无效十六进制色值,缺了开头的#,正确白色值是"#ffffff"。
修正方案

不要混写不同绘图体系的代码,用plotly原生语法重写绘图逻辑即可,参考代码如下:

# 先加载依赖包
library(plotly)
library(htmlwidgets)

# ---- 以下变量替换成你环境里的实际值即可 ----
i <- 1 # 对应你代码里的猪ID变量
lambda <- 0.1 # 对应你代码里的lambda值
idc <- 1 # 对应你代码里的文件命名序号
crit1 <- -5 # 对应你代码里红色虚线的y轴截距
res <- Pertubation # 你要绘制的y轴数值,和你之前的变量对应
y_range <- range(c(B$dif.CFI, res), na.rm = TRUE)
x_tick_pos <- seq(dif$eval_day[1], dif$eval_day[length(dif$eval_day)], by = 5)
# ---- 变量定义结束 ----

# 纯plotly语法绘图
Pertubation_graph <- plot_ly(
  data = data.frame(Age, res),
  x = ~Age,
  y = ~res,
  type = "scatter",
  mode = "markers",
  marker = list(symbol = 10, size = 3) # 对应原代码pch=10、cex=0.5的点样式
) %>%
  layout(
    title = paste("Pig ID:", i, ", Lambda =", lambda, "<br>Difference between CFI and TTC"),
    plot_bgcolor = "#ffffff",
    xaxis = list(
      title = "Age (d)",
      tickvals = x_tick_pos,
      tickfont = list(size = 13) # 对应原代码cex.axis=1.1
    ),
    yaxis = list(
      title = "Amount of difference: CFI - TTC (kg)",
      range = y_range,
      tickfont = list(size = 13)
    ),
    # 右侧百分比副坐标轴,对应原代码mtext+side=4的轴
    yaxis2 = list(
      title = "Percentage of difference: CFI - TTC (%)",
      overlaying = "y",
      side = "right",
      color = "blue",
      tickfont = list(color = "blue", size = 13)
    ),
    # 参考线,对应原代码abline
    shapes = list(
      list(
        type = "line", x0 = min(Age), x1 = max(Age), y0 = crit1, y1 = crit1,
        line = list(color = "red", dash = "dash") # 虚线对应lty=2
      ),
      list(
        type = "line", x0 = min(Age), x1 = max(Age), y0 = 0, y1 = 0,
        line = list(color = "red")
      )
    )
  )

# 直接保存plotly对象,不要套ggplotly
saveWidget(
  Pertubation_graph,
  file = paste0("C:/Users/Kevin Le/PycharmProjects/Pig Data Black Box/Graphs/Step3_graphs/", idc, ".", ID[idc], ".html")
)
注意事项
  • 如果习惯用base R或者ggplot2的语法逻辑,就全程用同一套语法绘图:用ggplot2画图再转plotly就全写ggplot代码,用原生plotly就查plotly的官方参数规则,不要把不同体系的函数、参数混着传。
  • 改完之后如果还有参数报错,逐一检查传给layout、plot_ly的参数是不是全是命名参数,有没有空值、未定义的变量即可。

内容的提问来源于stack exchange,提问作者Lam Tùng

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 16:15:45