如何解决Julia对数刻度绘制大误差棒时的No strict ticks found报错
问题原因与解决办法
报错原因
当error_amplitude=1.0时,误差棒的下限会变成y - error = y*(1-1.0) = 0,而对数刻度依赖对数函数,log(0)无意义(趋近于负无穷),绘图库无法为包含0的y轴范围生成有效的严格对数刻度,因此抛出"No strict ticks found"错误。而error_amplitude=0.5时,下限是0.5y,始终大于0,所以能正常生成刻度。
解决办法
1. 修正误差下限,避免非正值
手动将误差棒的下限限制在一个极小的正数(比如1e-10),确保所有y值范围都在对数函数的有效定义域内:
using Plots x = 1:10 y = x .^ (-2) # Power law y = x^(-2) error_amplitude = 1.0 error = y .* error_amplitude # 把下限设为不小于1e-10,避免log(0) lower_bound = max.(y .- error, 1e-10) upper_bound = y .+ error # 用元组传递不对称的误差范围(下限偏差、上限偏差) plot(x, y, xaxis=:log, yaxis=:log, ribbon=(y .- lower_bound, upper_bound .- y), legend=false)
2. 改用对数转换后的数据绘图
先对y值和误差做对数转换,再用线性刻度绘图,本质上和对数刻度效果一致,还能避开0的问题:
using Plots x = 1:10 y = x .^ (-2) log_y = log10.(y) error_amplitude = 1.0 error = y .* error_amplitude # 计算对数空间的误差范围 log_lower = log10.(max.(y .- error, 1e-10)) log_upper = log10.(y .+ error) plot(x, log_y, xaxis=:log, yaxis=("log(y)", :linear), ribbon=(log_y .- log_lower, log_upper .- log_y), legend=false)
3. 使用不对称误差定义
如果实际场景中误差的上下限本来就不对称,可以直接指定上下误差的具体值,确保下限始终大于0:
using Plots x = 1:10 y = x .^ (-2) # 自定义上下误差,比如上限用1.0倍y,下限用0.9倍y(避免到0) upper_error = y .* 1.0 lower_error = y .* 0.9 plot(x, y, xaxis=:log, yaxis=:log, ribbon=(lower_error, upper_error), legend=false)
内容的提问来源于stack exchange,提问作者João Vitor Vieira Flauzino
相关产品推荐
相关产品推荐

