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
相关产品推荐
相关产品推荐

