使用ggplot2(dynamic不手动)
我正在尝试使用ggplot2来创build一个日志正常y比例的性能图表。 不幸的是我不能产生好的滴答作为基地function。
这里我的例子:
library(ggplot2) library(scales) # fix RNG set.seed(seed=1) # simulate returns y=rnorm(999,0.02,0.2) # M$Y are the cummulative returns (like an index) M=data.frame(X=1:1000,Y=100) for (i in 2:1000) M[i,"Y"]=M[i-1,"Y"]*(1+y[i-1]) ggplot(M,aes(x=X,y=Y))+geom_line()+scale_y_continuous(trans=log_trans())
产生丑陋的蜱:
我也试过:
ggplot(M,aes(x=X,y=Y)) + geom_line() + scale_y_continuous(trans=log_trans(), breaks=pretty_breaks())
我如何获得与默认绘图函数相同的中断/滴答:
plot(M,type="l",log="y")
结果应该看起来像这样,但不是硬打字,而是dynamic的。 我尝试了像axisTicks()
函数,但没有成功:
ggplot(M,aes(x=X,y=Y)) + geom_line() + scale_y_continuous(trans=log_trans(), breaks=c(1,10,100,10000))
谢谢!
编辑:插入图片
基本的graphics行为可以使用自定义restfunction进行复制:
base_breaks <- function(n = 10){ function(x) { axisTicks(log10(range(x, na.rm = TRUE)), log = TRUE, n = n) } }
将这个应用于示例数据给出了与使用trans_breaks('log10', function(x) 10^x)
相同的结果:
ggplot(M, aes(x = X, y = Y)) + geom_line() + scale_y_continuous(trans = log_trans(), breaks = base_breaks()) + theme(panel.grid.minor = element_blank())
但是我们可以在数据的一个子集上使用相同的函数,y值在50到600之间:
M2 <- subset(M, Y > 50 & Y < 600) ggplot(M2, aes(x = X, y = Y)) + geom_line() + scale_y_continuous(trans = log_trans(), breaks = base_breaks()) + theme(panel.grid.minor = element_blank())
由于十的权力在这里不再适合, base_breaks
会产生另一个漂亮的中断:
请注意,我已经closures了小网格线:在某些情况下,在y轴上的主网格线之间有网格线是有意义的,但并不总是如此。
编辑
假设我们修改M使得最小值为0.1:
M <- M - min(M) + 0.1
base_breaks()函数仍然会select相当的中断,但标签是以科学记数法表示的,这可能不会被视为“漂亮”:
ggplot(M, aes(x = X, y = Y)) + geom_line() + scale_y_continuous(trans = log_trans(), breaks = base_breaks()) + theme(panel.grid.minor = element_blank())
我们可以通过将文本格式化函数传递给scale_y_continuous
的labels
参数来控制文本格式。 在这种情况下,来自基础包的prettyNum
很好地完成了这项工作:
ggplot(M, aes(x = X, y = Y)) + geom_line() + scale_y_continuous(trans = log_trans(), breaks = base_breaks(), labels = prettyNum) + theme(panel.grid.minor = element_blank())
当我在对数标度上构build图表时,我发现以下工作非常好:
g = ggplot(M,aes(x=X,y=Y)) + geom_line() g + scale_y_continuous(trans = 'log10', breaks = trans_breaks('log10', function(x) 10^x), labels = trans_format('log10', math_format(10^.x)))
有几点不同:
- 轴标签显示为十的幂 – 我喜欢
- 次要网格线位于主要网格线的中间(比较这个绘图与Andrie的答案中的网格线)。
- x轴更好。 出于某种原因,在Andrie的情节中,x轴的范围是不同的。
给
基本graphics函数axTicks()
返回当前绘图的轴断点。 所以,你可以使用它来返回与基础graphics相同的中断。 唯一的缺点是你必须先绘制基本graphics图。
library(ggplot2) library(scales) plot(M, type="l",log="y") breaks <- axTicks(side=2) ggplot(M,aes(x=X,y=Y)) + geom_line() + scale_y_continuous(breaks=breaks) + coord_trans(y="log")