作为一种解决方法,我有一个修改版本的Heckbert 1990 年的 Graphics Gems 代码,可以在给定的最小值/最大值内生成刻度。在(我的天真)Julia 中看起来像这样:
# find a "nice" number approximately equal to x.
# round the number if round=true, take the ceiling if round=false
function nicenum{T<:FloatingPoint}(x::T, round::Bool)
ex::T = 10^floor(log10(x))
f::T = x/ex
convert(T, if round
if f < 1.5; 1.
elseif f < 3.; 2.
elseif f < 7.; 5.
else; 10.
end
else
if f <= 1.; 1.
elseif f <= 2.; 2.
elseif f <= 5.; 5.
else; 10.
end
end)*ex
end
function pretty_inner{T<:FloatingPoint}(min::T, max::T, ntick::Int)
if max < min
error("min must be less than max")
end
if min == max
return min:one(T):min
end
delta = nicenum((max-min)/(ntick-1),false)
gmin = ceil(min/delta)*delta
gmax = floor(max/delta)*delta
# shift max a bit in case of rounding errors
gmin:delta:(gmax+delta*eps(T))
end
并可用作:
plot(x=[2.9,8.01],y=[-0.01,0.81],
Guide.xticks(ticks=[pretty_inner(2.9,8.01,7)]),
Guide.yticks(ticks=[pretty_inner(-0.01,0.81,7)]))
并将给出与我从 R 得到的结果相同的结果。
如果可以自动拉出范围会很棒,但我看不出如何在现有的 Gadfly 代码中做到这一点。