在 Gadfly 中使用对数刻度调整刻度间距

Adjusting tick spacing with log scale in Gadfly

我正在尝试使用 Gadfly 在 Julia 中创建以下图:


(来源:missouri.edu

我有一些现有的 R 代码为此创建了一个空白基础,作为使用带有参数 log='xy' 的 matplot 的更大绘图函数的一部分,这会导致正确间隔的刻度。

...matplot(tpa, qmd, ylab = "Quadratic Mean Diameter", 
xlab = "Trees per acre", type = "n",
log = "xy", xlim = c(1,1200),
ylim = c(1, 40),main ="")...

我目前的Julia代码是

Using Gadfly
plot(x=[1],y=[1],
Scale.x_log, Scale.y_log,
Scale.x_continuous(minvalue=1,maxvalue=1200),
Scale.y_continuous(minvalue=1,maxvalue=40),
Guide.xticks(ticks=[1,5,10,50,100,500,1000]),
Guide.YTicks(ticks=[1,2,5,10,20]),
Guide.XLabel("Trees per acre"), Guide.YLabel("Quadratic Mean Diameter"),
Theme(grid_color=colorant"black"),
Geom.point)

这会在适当的值处创建刻度,但间距会关闭,导致较低的值相互压缩。我尝试修改 Scale.x_log 并将参数移动到连续参数之后,但我无法从示例图中重新创建所需的轴。

关于如何调整对数刻度轴参数以创建上面的图,有什么建议吗?

为此使用不同的图形库会更容易吗? 我选择 Gadfly 是因为我对 ggplot 语法更熟悉,但我在谷歌搜索中不断遇到 plots() 和 Pyplot() 包。

EDIT/WORKING 代码:

我成功了,关键是传递所需断点的日志。非常感谢 Felipe 的 lambda 函数,我不熟悉它们是如何工作的。

myxticks=log([1,5,10,50,100,500,1000])
myyticks=log([1,2,5,10,20])

plot(x=[1], y=[1],
Geom.point,
Scale.x_log(labels=d-> @sprintf("%d",e^d)),
Scale.y_log(labels=d-> @sprintf("%d",e^d)),
Guide.xticks(ticks=myxticks),
Guide.yticks(ticks=myyticks)
) 

您应该使用 Scale.x_log 而不是 Scale.x_continuous。如果你看到the source,你可以看到这两者之间的唯一区别是转换功能。*

*:我会称它为 translation 函数,但是嘿,这就是我。

编辑:

所以上面的内容并没有完全做到间距,这需要在 logexp 之间来回移动一点。以下内容应该对您有所帮助,但您必须使用参数才能获得所需内容:

using Gadfly
pts=collect(1:20)
theticks=collect(log(linspace(1,20,10)))
plot(x=pts, y=pts,
     Geom.point, Scale.x_log(labels=d-> @sprintf("%d",e^d)),
     Guide.xticks(ticks=theticks))