簡體   English   中英

R ggplot2:使用stat_summary(平均值)和對數標度

[英]R ggplot2: using stat_summary (mean) and logarithmic scale

我隨時間進行了大量測量,我想將它們繪制在R中。這是我的數據示例。 我在4個時間點中分別有6個測量值:

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()

該行不會在t = 0時經過0,因為您期望的是log(1)==0。相反,該行與y軸交叉的位置略低於0。顯然, ggplot 對數轉換應用均值,從而得出結果不同。 我希望它對數轉換之前取平均值。

如何告訴ggplot首先應用均值? 有沒有更好的方法來創建此圖表?

scale_y_log2()將首先進行轉換,然后計算幾何。

coord_trans()將執行相反的操作:首先計算幾何圖形,然后轉換軸。

因此,您需要coord_trans(ytrans = "log2")而不是scale_y_log2()

如果您不想使用coord_trans()並且仍然想要轉換數據,那么一種解決方法是創建一個函數,該函數將對其進行反向轉換:

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

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

我發現的最佳解決方案是使用coord_trans()scale_y_continuous(breaks = breaks)

如先前建議的那樣,使用coord_trans可以縮放您的軸而無需轉換數據,但是它將使您的軸難看。

coord_trans設置限制適用於某些事情,但是如果您想將軸固定為具有特定標簽,則將scale_y_continuous包含在想要設置的中斷處。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM