如何使用Julia的Plots库获取图表内所有数据点的(x,y)坐标列表
解答
首先明确:不建议从Plots渲染完成的图表对象中反向提取数据点。Plots作为多后端统一绘图抽象层,不同后端存储绘图数据的结构不统一,反向提取不仅兼容性差、容易出错,且你当前场景下完全不需要这么做——所有绘图用的源数据都存在你已经生成的GeoStats对象中,直接调用对象属性取值计算,比从图上扒点准确且高效得多。
针对变异函数拟合误差计算的正确实现方式
你当前需要比对经验半变异函数点和理论拟合模型值,直接操作EmpiricalVariogram和拟合得到的变异函数对象即可,不需要和Plots绘图对象交互:
- 经验半变异函数的所有观测点直接从
g对象提取:- x轴滞后距:
g.abscissas - 对应y轴经验半方差值:
g.ordinates - 每个滞后距对应的样本点对计数(可用于加权误差计算):
g.counts
- x轴滞后距:
- 拟合得到的理论变异函数
γ本身是可调用的函数对象,传入滞后距数组即可直接得到对应位置的模型预测半方差值,不需要从绘制的模型曲线上采样。
误差计算代码
你可以直接把以下代码加到现有脚本的绘图逻辑之后,即可得到MAE、RMSE指标:
# 提取经验变异函数观测数据 lag_obs = g.abscissas semivar_obs = g.ordinates # 计算对应滞后距下的理论模型预测值 semivar_pred = γ.(lag_obs) # 计算误差指标 mae = mean(abs.(semivar_obs .- semivar_pred)) rmse = sqrt(mean((semivar_obs .- semivar_pred).^2)) println("拟合MAE: ", round(mae, digits=4)) println("拟合RMSE: ", round(rmse, digits=4))
(不推荐)从Plots对象提取数据的方法
如果确实需要从已生成的Plots图表中取点,可通过访问图表的series属性实现:
# 先把绘图结果赋值给变量p p = plot(g, label = "经验变异函数") plot!(p, γ, label = "拟合理论模型") hline!(p, [γ.nugget], label = "块金值") hline!(p, [γ.sill], label = "基台值") # 访问系列数据,序号对应绘图顺序 emp_x, emp_y = p.series[1][:x], p.series[1][:y] # 经验变异函数点 model_x, model_y = p.series[2][:x], p.series[2][:y] # 理论模型曲线点
注意:该方法存在明显缺陷:不同Plots版本、不同绘图后端(GR/PyPlot/PlotlyJS等)的series存储结构可能存在差异;且理论模型曲线的点是绘图时自动等间距采样生成的,和经验变异函数的原始观测滞后点不匹配,直接用这两组点计算误差结果不准确,非必要不要使用。
内容的提问来源于stack exchange,提问作者UltraScienceGuy
相关产品推荐
相关产品推荐

