ggplot scale_continuous如何与stat_summary结合使用

时间:2015-04-09 14:50:32

标签: r ggplot2

我有一些看起来像这样的数据(实际上有更多的数据):

size program group percent
1    prog1   1     50
2    prog1   1     0.1
1    prog1   2     75
2    prog1   2     1 
1    prog2   1     55
2    prog2   1     2
1    prog2   2     70
2    prog2   2     4 

我想用这样的东西来绘制:

plot1 <- ggplot(tbl, aes(size, percent, group=group, color=group))+
         geom_point()+
         stat_summary(fun.y=gm_mean, geom='line')+
         scale_x_continuous(trans=log2_trans())+
         scale_y_continuous(trans=log2_trans())

gm_mean <- function(x) {
 exp(mean(log(x)))

}

如果我尝试运行此操作,我会收到此警告: 在loop_apply(n,do.ply)中:生成NaN 我打印出了我在gm_mean中获得的值,我发现它们不是我期望的实际值,但它们看起来像这些值的log2。 (0.1变为-3.3,然后从log()得到NaN我认为) 这是否意味着使用fun.y = mean会在使用scale_y_continuous(trans = log2_trans())时实际计算几何平均数? 如果不是,您将如何获得几何平均值,如果是,如果需要,您将如何获得具有对数刻度的实际平均值?

我尝试做的是制作一种散点图,然后绘制2条几何平均线(每组一条),但是按log2标度。

1 个答案:

答案 0 :(得分:0)

  

这是否意味着使用fun.y = mean会在使用scale_y_continuous(trans = log2_trans())时实际计算几何平均值?

是的,我认为这确实意味着。以下是一些试用数据的例子:

#packages
require(ggplot2)
require(scales)

#gm_mean function:
gm_mean <- function(x){exp(mean(log(x)))}

#trial data
df <- data.frame(x=sample(1:5, size=100, replace=T), 
                 group=factor(sample(c(1,2,3), size=100, replace=T)))

df$y <- df$x*as.numeric(as.character(df$group))+rnorm(100)+1

#create one outlier for easier visual differences between geomean and arithmean
df[df$x==1&df$group==1,][1,'y'] <- 30

#create base plots
d <- qplot(data=df, x=x, y=y, group=group, color=group) + theme_bw()
d2 <- d + scale_y_continuous(trans=log2_trans()) +
          scale_x_continuous(trans=log2_trans())

#comparing different plots
quartz(width=4, height=4)
d + stat_summary(fun.y=mean, geom='line') + labs(title='untransformed arithmean')
quartz(width=4, height=4)
d + stat_summary(fun.y=gm_mean, geom='line') + labs(title='untransformed geomean')
quartz(width=4, height=4)
d2 + stat_summary(fun.y=mean, geom='line') + labs(title='transformed arithmean')
quartz(width=4, height=4)
d2 + stat_summary(fun.y=gm_mean, geom='line') + labs(title='transformed geomean')

观察:

  1. 在具有算术平均值的变换图上,组1的线与具有几何平均值的未变换图的线相同。 因此,你是对的。

  2. 相反,使用算术平均值的未转换图上的同一行更容易被人工异常值扭曲。

  3. 用几何平均值转换的图上的相同线条是没有意义的,并且遇到了许多NaN问题。您不应该使用具有对数变换轴的几何方法。

  4. 还有一个想法:您确定要stat_summary()代替stat_smooth()吗?您的数据在x轴上只有两个点,所以我无法确定,但在我看来,通过示例数据,这些图表提供了更多信息:

    quartz(width=4, height=4)
    d2 + stat_smooth(method='lm', formula=y~x, se=F) + 
         labs(title='stat_smooth transformed')
    quartz(width=4, height=4)
    d + stat_smooth(method='lm', formula=y~I(2^log(x,2)), se=F) + 
         labs(title='stat_smooth untransformed')