2

我不喜欢 Gadfly 在绘图时选择轴限制的方式,例如,我制作的其中一个绘图仅在画布的中心四分之一处有数据。MWE 可以是:

plot(x=[2.9,8.01],y=[-0.01,0.81])

上图的截图 然后,Gadfly 为 y 轴选择 [0,10] 和 [-0.5,1] 的 x 轴范围,这对我来说似乎都太宽了。这里的值显然是虚构的,但基本上是我真实数据的边界框。

我更希望不要有所有的空白,比如 R 的默认 4% 模式(即par(xaxs='r',yaxs='r'))。我可以通过以下方式在 Gadfly 中获得类似的东西:

plot(x=[2.9,8.01],y=[-0.01,0.81]
  Guide.xticks(ticks=[3:8]),
  Guide.yticks(ticks=[0:0.2:0.8]))

IE第二个例子的截图

牛虻中是否已经存在类似的东西?鉴于我很难找到Guide.[xy]ticks我期望我需要为此编写一些代码......</p>

指点赞赏!

4

1 回答 1

1

作为一种解决方法,我有一个修改版本的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 代码中做到这一点。

于 2015-03-09T22:17:07.247 回答