【问题标题】:R ggplot2: using stat_summary (mean) and logarithmic scaleR ggplot2:使用 stat_summary(平均值)和对数刻度
【发布时间】:2011-03-24 04:51:50
【问题描述】:

随着时间的推移,我有一堆测量值,我想在 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 应用了平均值 after 对数转换,得到不同的结果。我希望它采用平均 before 对数转换。

我如何告诉ggplot 先应用平均值?有没有更好的方法来创建这个图表?

【问题讨论】:

    标签: r ggplot2 statistics logarithm


    【解决方案1】:

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

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

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

    【讨论】:

    • 这再简单不过了。非常感谢!
    • 注意:scale_y_log2 不再存在,请改用scale_y_continuous
    【解决方案2】:

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

    f1 <- function(x) {
      log10(mean(10 ^ x)) 
    }
    
    stat_summary (fun.y = f1, geom="line", mapping = aes (group = 1))
    

    【讨论】:

    • 这应该是log10(mean(10 ^ x)),而不是(如你所写)10 ^ mean(x)
    • 你是对的。我更新了我提议的函数来解决这个问题。它对我有用。
    【解决方案3】:

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

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

    coord_trans 中设置限制适用于某些情况,但如果您想将轴固定为具有特定标签,则需要在您希望设置的中断中包含scale_y_continuous

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-06-10
      • 2021-02-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-05
      • 1970-01-01
      相关资源
      最近更新 更多