3

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

示例图
(来源:missouri.edu

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

...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() 包。

编辑/工作代码:

我让它工作了,关键是通过所需断点的日志。非常感谢 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)
) 
4

1 回答 1

1

您应该使用Scale.x_log 不是Scale.x_continuous. 如果您查看源代码,您可以看到这两者之间的唯一区别是转换函数。*

*:我称之为翻译功能,但嘿,这只是我。

编辑:

log所以上面的内容对于间距来说并没有完全做到这一点,这需要在and之间来回多一点exp。以下内容应该可以帮助您作为骨架,尽管您必须使用参数才能获得所需的内容:

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))

在此处输入图像描述

于 2016-05-02T13:09:26.547 回答