2010-08-02 29 views
4

J'ai un tas de mesures dans le temps et je veux les tracer dans R. Voici un échantillon de mes données. J'ai 6 mesures pour chacun des 4 points de temps:R ggplot2: en utilisant stat_summary (mean) et l'échelle logarithmique

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

L'ampleur de ces données est arbitraire, et en fait, je vais normaliser de sorte que la moyenne de t = 0 est 1.

norm <- values/mean (values[time == 0]) 

Jusqu'ici tout va bien. En utilisant ggplot, je tracer les points individuels, ainsi que d'une ligne qui passe par la moyenne à chaque point de temps:

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

Cependant, maintenant je veux appliquer une échelle logarithmique, ce qui est où ma peine commence . Quand je fais:

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

La ligne ne passe pas par 0 à t = 0, comme on peut s'y attendre parce que log (1) == 0. Au lieu de cela la ligne traverse l'y-axe légèrement en dessous de 0. Apparemment, ggplot applique la moyenne après log transformation, ce qui donne un résultat différent. Je veux qu'il prenne la moyenne avant log transformation.

Comment puis-je dire à ggplot d'appliquer la moyenne en premier? Y a-t-il une meilleure façon de créer ce graphique?

Répondre

6

scale_y_log2() effectuera d'abord la transformation, puis calculera les geoms.

coord_trans() fera l'opposé: calculer les geoms en premier, et transformer l'axe.

Vous avez donc besoin coord_trans(ytrans = "log2") au lieu de scale_y_log2()

+0

Cela ne pourrait être plus simple. Merci beaucoup! – amarillion

+2

note: 'scale_y_log2' n'existe plus, utilisez' scale_y_continuous' à la place –

0

Un travail autour de le résoudre, si vous ne voulez pas utiliser coord_trans() et veulent encore transformer les données, est de créer une fonction qui sera de retour transformer il:

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

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

Cela devrait être 'log10 (mean (10^x))', pas (comme vous l'avez écrit) '10^mean (x)'. –

0

La meilleure solution que je pour cette question était d'utiliser un combo de coord_trans() et scale_y_continuous(breaks = breaks)

Comme nous l'avons suggéré, en utilisant coord_trans sera mettre à l'échelle votre axe sans transformer les données, mais il vous laissera avec un axe laid.

La définition des limites dans coord_trans fonctionne pour certaines choses, mais si vous souhaitez corriger votre axe pour avoir des étiquettes spécifiques, vous devez alors inclure scale_y_continuous avec les ruptures que vous souhaitez définir.

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