2013-02-28 67 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")