2013-02-28 39 views
2

我遇到严重的问题,试图在R的ggplot2中找到我的头部stat_function。我从这个微不足道的例子开始:使用对数刻度上的stat_function绘制R

ggplot(data.frame(x = c(1, 1e4)), aes(x)) + stat_function(fun = function(x) x) 

它按预期工作。不幸的是,当我添加日志秤两个x和y轴这样:

ggplot(data.frame(x = 1:1e4), aes(x)) + 
    scale_x_log10() + 
    scale_y_log10() + 
    stat_function(fun = function(x) x) 

我得到以下的结果,这是一个非常讨厌的违反身份的功能。 enter image description here

有什么非常基本的,我失踪了?那么什么是在日志规模上绘制函数的正确和最简单的方法呢?

编辑: 由我去和有鳞屑和aesthetics参数试验的答案启发。更令我不解地发现,我得到了我的预期使用下面的代码:

ggplot(data.frame(x = 1:1e4, y = 1:1e4), aes(x, y)) + 
    scale_x_log10() + 
    scale_y_log10() + 
    stat_function(fun = function(x) x) 

与y值的明显使用的向量(由stat_function即未使用)。轴转换是否取决于数据的可用性?

回答

4

当您使用scale_x_log10()时,那么x值将进行对数转换,然后仅用于计算y值与stat_function()。然后将x值转换为原始值来制作比例。 y值保持如从转换对数x计算。您可以通过绘制数值来检查这一点,而不需要scale_y_log10()。在情节里有直线。

ggplot(data.frame(x=1:1e4), aes(x)) + 
    stat_function(fun = function(x) x) + 
    scale_x_log10() 

如果应用scale_y_log10()您登录变换已经计算y值,因此曲线绘制。

+0

是的,非常好,我正在调整ggplot的工作顺序。 – joran 2013-02-28 20:43:59

4

在ggplot2中,规则是规模变换在统计变换之前,而统计变换又在坐标变换之前。在这种情况下,函数(通过stat_function())是统计变换。

如果在ggplot2调用中使用scale_x/y _ *()函数,它将在计算函数之前首先应用比例变换。

案例0:绘制x和y的原始尺度。

ggplot(data.frame(x = 1:1e4, y = 1:1e4), aes(x, y)) + 
    stat_function(fun = function(x) x) 

壳体1A:因为SCALE_X/y_log10的存在被计算的功能前X和Y两者都数变换()。你可以从它们各自尺度上的值中看到这一点(与案例0相比)。

ggplot(data.frame(x = 1:1e4, y = 1:1e4), aes(x, y)) + 
    stat_function(fun = function(x) x) + 
    scale_x_log10() + 
    scale_y_log10() 

例1b:x在原始数据帧中进行对数转换。因此,该函数实际上对log10(x)值进行操作,所以仍然是一条直线,但是x和y都是log10的比例。

ggplot(data.frame(x = log10(seq(1e4)), y = seq(1e4)), aes(x, y)) + 
    stat_function(fun = function(x) x) 

为例1C:同1B,但有一个例外:在x尺度是在原单位,但在y规模在日志10(x)的单元,因为在x中的比例变前的发生计算统计变换f(y)= y,其中y = log10(x)。

ggplot(data.frame(x = seq(1e4), y = seq(1e4)), aes(x, y)) + 
    stat_function(fun = function(x) x) + 
    scale_x_log10() 

案例2:相比之下,坐标变换发生统计变换;即,该功能被计算在原来的单位,然后再对X坐标变换发生,这扭曲的功能:

ggplot(data.frame(x = seq(1e4), y = seq(1e4)), aes(x, y)) + 
    stat_function(fun = function(x) x) + 
    coord_trans(xtrans = "log10") 

...除非,当然,你应用相同的变换,x和y:

ggplot(data.frame(x = seq(1e4), y = seq(1e4)), aes(x, y)) + 
    stat_function(fun = function(x) x) + 
    coord_trans(xtrans = "log10", ytrans = "log10")