4

随着时间的推移,我有一堆测量值,我想在 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先应用平均值?有没有更好的方法来创建这个图表?

4

3 回答 3

9

scale_y_log2()将首先进行转换,然后计算几何。

coord_trans()将做相反的事情:首先计算几何,然后转换轴。

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

于 2010-08-02T13:06:53.830 回答
3

如果您不想使用 coord_trans() 并且仍想转换数据,则解决它的方法是创建一个将对其进行反向转换的函数:

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

stat_summary (fun.y = f1, geom="line", mapping = aes (group = 1))
于 2016-11-02T14:24:31.837 回答
0

我为这个问题找到的最佳解决方案是使用coord_trans()scale_y_continuous(breaks = breaks)

如前所述, usingcoord_trans将在不转换数据的情况下缩放您的轴,但是它会给您留下一个丑陋的轴。

为某些事情设置限制coord_trans,但如果你想修复你的轴以具有特定的标签,那么你将包括scale_y_continuous你想要设置的中断。

coord_trans(y = 'log10') +
scale_y_continuous(breaks = breaks)
于 2017-05-25T20:05:15.073 回答