R ggplot2:使用stat_summary(mean)和对数标度

时间:2010-08-02 12:37:58

标签: r ggplot2 statistics logarithm

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

3 个答案:

答案 0 :(得分:7)

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

coord_trans()将执行相反的操作:首先计算geoms,然后计算轴的转换。

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

答案 1 :(得分:1)

如果你不想使用coord_trans()并且仍然想要转换数据,那么解决它的工作就是创建一个函数来反转它:

'input[type=radio]:not(element)'

答案 2 :(得分:0)

我发现此问题的最佳解决方案是使用coord_trans()scale_y_continuous(breaks = breaks)的组合

如前所述,使用coord_trans将缩放轴而不转换数据,但是它会让您看到一个丑陋的轴。

coord_trans中设置限制适用于某些内容,但如果您想修改轴以具有特定标签,则会在scale_y_continuous中添加您想要设置的中断。

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