Plotly等高线图绘制异常排查:与filled.contour结果不符求助
嘿,我来帮你梳理下为什么Plotly的结果不对,而filled.contour能正常输出~先从你的代码和常见坑点说起:
首先,修正代码里的基础错误
你写的rand(15,1)在R里是行不通的哦,R没有内置的rand()函数,得用runif(15)来生成0-1之间的均匀随机数,这一步出错的话,后续的插值和绘图都会受影响。
核心问题:Plotly的调用逻辑和filled.contour不一样
filled.contour可以直接接收akima插值后的网格数据,但Plotly需要你明确指定等高线的trace类型,还要设置填充参数,否则会默认生成不符合预期的图形。常见的错误点有这几个:
1. 没指定trace类型为contour
如果直接用plot_ly(x = a$x, y = a$y, z = a$z),Plotly会默认用散点图(scatter)来绘制,这肯定和filled.contour的填充等高线差十万八千里。必须用add_contour()或者指定type = "contour"来告诉Plotly要画等高线。
2. 没开启填充效果
filled.contour默认是填充式的等高线,但Plotly的contour默认只有线条,你需要显式设置contours.coloring = "fill"才能得到和filled.contour一致的填充效果。
3. 误把z矩阵转成了向量
akima的interp()返回的a$z是二维矩阵,刚好匹配Plotly contour对z的要求,但如果不小心把它转成了向量(比如用as.vector(a$z)),就会导致绘图错乱。
正确的Plotly绘制代码示例
把这些坑都避开后,代码应该是这样的:
require(akima) require(plotly) # 修正数据生成 x <- runif(15) y <- runif(15) z <- runif(15) # 插值获取网格数据 a <- interp(x, y, z) # 绘制填充等高线 p <- plot_ly() %>% add_contour( x = a$x, y = a$y, z = a$z, contours = list( coloring = "fill", # 开启填充,对应filled.contour的效果 showlines = TRUE # 同时显示等高线线条 ) ) %>% layout( xaxis = list(title = "X轴"), yaxis = list(title = "Y轴"), title = "Plotly 填充等高线图" ) # 展示图形 p
对比下filled.contour的代码,你会发现两者的逻辑是对应的:
# filled.contour的正确绘制 filled.contour(a$x, a$y, a$z, main = "filled.contour 填充等高线图")
总结
你之前的Plotly代码应该是没写完或者参数设置不对,只要明确指定contour类型,开启填充效果,就能得到和filled.contour一样正确、同时符合Plotly视觉风格的等高线图啦~
内容的提问来源于stack exchange,提问作者Heraldo Da Silva

