使用GLMakie绘制动画线散点图出现InexactError: Int64(0.2)错误如何解决
报错根因
该错误并非你使用的业务数据类型异常导致,是旧版本GLMakie处理Date类型作为坐标轴坐标时,内部自动调整轴范围、计算刻度步长的逻辑会生成浮点型偏移量,尝试将0.2这类非整数浮点数强制转换为对应Int64类型的时间戳时无法精确转换,进而触发InexactError。你另一组测试数据未触发报错,大概率是该组数据x轴非Date类型,或数值范围刚好让Makie计算出的刻度步长为整数。
可行解决方法
- 方案1:固定坐标轴范围,禁用自动调整
在创建Axis时直接指定x、y轴的上下限,避免运行过程中自动调整轴范围触发类型转换错误,修改后的Axis创建代码如下:ax1 = fig[1, 1] = Axis(fig, title = "US COVID-19", titlegap = 14, titlesize = 14, xlabel = "日期", xlabelsize = 12, ylabel = "确诊数", ylabelsize = 12, # 新增固定轴范围配置 limits = (minimum(d1.date), maximum(d1.date), 0, maximum([maximum(d1.value), maximum(d1.value2)]) + 5) ) - 方案2:转换x轴为数值序号,手动配置刻度标签
若你使用的GLMakie版本过旧,固定范围仍无法解决问题,可以把x轴替换为1~n的整数序号,再手动映射刻度为对应日期,修改后完整代码如下:fig = Figure(resolution = (800, 480)) # 提前生成x轴序号和对应刻度标签 x_seq = 1:nrow(d1) xtick_pos = x_seq[1:3:end] # 每3个数据点显示一个刻度,避免标签拥挤 xtick_label = Dates.format.(d1.date[1:3:end], "yyyy-mm-dd") ax1 = fig[1, 1] = Axis(fig, title = "US COVID-19", titlegap = 14, titlesize = 14, xlabel = "日期", xlabelsize = 12, ylabel = "确诊数", ylabelsize = 12, xticks = (xtick_pos, xtick_label), limits = (0, nrow(d1)+1, 0, maximum([maximum(d1.value), maximum(d1.value2)]) + 5) ) frames = 1:(length(d1.date)) colors = [:red, :blue] columns = propertynames(d1)[2:end] record(fig, "covid_US.mp4", frames; framerate = 2) do i for j in 1:length(columns) lines!(ax1, x_seq[1:i], d1[1:i, (j + 1)], color = (colors[j], 0.5) ) scatter!(ax1, x_seq[1:i], d1[1:i, (j + 1)], color = colors[j] ) end end - 方案3:升级GLMakie到最新稳定版
0.19及以上版本的GLMakie已经修复了时间类型坐标轴的自动转换bug,直接更新包即可解决问题:using Pkg Pkg.update("GLMakie")
可选优化建议
你当前代码每渲染一帧都会往轴上新增lines!、scatter!对象,帧数量大时会出现卡顿,可提前创建Observable类型的数据源,每帧仅更新数据内容而非新增绘图对象,运行效率会有明显提升。
内容的提问来源于stack exchange,提问作者codedancer
相关产品推荐
相关产品推荐

