2010-08-02 184 views
4

我有一堆隨着時間的測量,我想在R中繪製它們。下面是我的數據樣本。我有6次測量的每4個時間點:R ggplot2:使用stat_summary(mean)和對數刻度

values <- c (1012.0, 1644.9, 837.0, 1200.9, 1652.0, 981.5, 
    2236.9, 1697.5, 2087.7, 1500.8, 
    2789.3, 1502.9, 2051.3, 3070.7, 3105.4, 
    2692.5, 1488.5, 1978.1, 1925.4, 1524.3, 
    2772.0, 1355.3, 2632.4, 2600.1) 
time <- factor (rep (c(0, 12, 24, 72), c(6, 6, 6, 6))) 

這些數據的規模是任意的,其實我要正常化它,以便T的平均= 0是1

norm <- values/mean (values[time == 0]) 

到目前爲止好。使用ggplot,我繪製了單個的點,以及通過平均在每一個時間點進了行:

require (ggplot2) 
p <- ggplot(data = data.frame(time, norm), mapping = aes (x = time, y = norm)) + 
    stat_summary (fun.y = mean, geom="line", mapping = aes (group = 1)) + 
    geom_point() 

不過,現在我想申請一個對數標度,這是我的麻煩就來了。當我這樣做:

q <- ggplot(data = data.frame(time, norm), mapping = aes (x = time, y = norm)) + 
    stat_summary (fun.y = mean, geom="line", mapping = aes (group = 1)) + 
    geom_point() + 
    scale_y_log2() 

行不通過0走在t = 0,你所期望的,因爲日誌(1)== 0,取而代之的是線橫穿略低於0 y軸顯然, ggplot在對數轉換後應用均值,這給出了不同的結果。我希望它在日誌轉換之前採取平均值

我該如何告訴ggplot先應用平均值?有沒有更好的方法來創建這個圖表?

回答

6

scale_y_log2()會首先做的改造,然後計算geoms。

coord_trans()將做相反:首先計算geoms,和轉換的軸。

所以你需要coord_trans(ytrans = "log2"),而不是scale_y_log2()

+0

這並不簡單。非常感謝! – amarillion 2010-08-02 13:41:12

+2

注意:'scale_y_log2'不再存在,請使用'scale_y_continuous'而不是 – 2013-09-16 13:38:19

0

一個解決解決這個問題,如果你不想將使用coord_trans(),仍然要變換的數據,是創建將支持變換功能它:

f1 <- function(x) { 
    10^(mean(x)) 
} 

stat_summary (fun.y = f1, geom="line", mapping = aes (group = 1)) 
+0

這應該是log10(mean(10^x))',而不是(如您所寫)'10^mean(x)'。 – 2017-09-21 15:55:21

0

我發現這個問題的最佳解決方案是使用的coord_trans()組合和scale_y_continuous(breaks = breaks)

正如前面所說,使用coord_trans會在不改變數據的情況下縮放您的軸,但是它會讓您看到一個醜陋的軸。

coord_trans中設置限制適用於某些事情,但如果您想修復軸以具有特定標籤,那麼您將包含scale_y_continuous以及您想設置的分隔符。

coord_trans(y = 'log10') + 
scale_y_continuous(breaks = breaks)