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

如何使用Julia的Plots库获取图表内所有数据点的(x,y)坐标列表

解答

首先明确:不建议从Plots渲染完成的图表对象中反向提取数据点。Plots作为多后端统一绘图抽象层,不同后端存储绘图数据的结构不统一,反向提取不仅兼容性差、容易出错,且你当前场景下完全不需要这么做——所有绘图用的源数据都存在你已经生成的GeoStats对象中,直接调用对象属性取值计算,比从图上扒点准确且高效得多。

针对变异函数拟合误差计算的正确实现方式

你当前需要比对经验半变异函数点和理论拟合模型值,直接操作EmpiricalVariogram和拟合得到的变异函数对象即可,不需要和Plots绘图对象交互:

  • 经验半变异函数的所有观测点直接从g对象提取:
    • x轴滞后距:g.abscissas
    • 对应y轴经验半方差值:g.ordinates
    • 每个滞后距对应的样本点对计数(可用于加权误差计算):g.counts
  • 拟合得到的理论变异函数γ本身是可调用的函数对象,传入滞后距数组即可直接得到对应位置的模型预测半方差值,不需要从绘制的模型曲线上采样。

误差计算代码

你可以直接把以下代码加到现有脚本的绘图逻辑之后,即可得到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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 13:36:17