使用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_continuouslabels参数来控制文本格式。 在这种情况下,来自基础包的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))) 

有几点不同:

  1. 轴标签显示为十的幂 – 我喜欢
  2. 次要网格线位于主要网格线的中间(比较这个绘图与Andrie的答案中的网格线)。
  3. 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") 

在这里输入图像说明