2010-11-22 34 views
19
library(ggplot2) 

orderX <- c("A" = 1, "B" = 2, "C" = 3) 
y <- rnorm(20) 
x <- as.character(1:20) 
group <- c(rep("A", 5), rep("B", 7), rep("C", 5), rep("A", 3)) 
df <- data.frame(x, y, group) 
df$lvls <- as.numeric(orderX[df$group]) 

ggplot(data = df, aes(x=reorder(df$x, df$lvls), y=y)) + 
geom_point(aes(colour = group)) + 
geom_line(stat = "hline", yintercept = "mean", aes(colour = group)) 

Je veux créer un graphique comme celui-ci: cependant, graph with averages for each groupggplot2: ajoutez la ligne pour la moyenne par groupe

Cela fonctionne, quand je ne ai pas besoin de réorganiser les valeurs de X, quand je fais utiliser réorganiser, ça ne marche plus.

+0

Je pense que votre utilisation de réordonnancement se trompe ici, depuis il faudra juste réorganiser X, pas les groupes ou Y. Cela tracera le mauvais x avec le mauvais y! –

+0

Sauf si X ne veut rien dire d'autre que l'index, dans ce cas, ne l'utilisez pas dans l'intrigue (utilisez jitter à la place?) –

+0

Ensuite, mon utilisation de la commande est erronée. Dans mes données réelles, les valeurs sur x sont des étiquettes pour chaque mesure individuelle, ce que je veux voir. La commande de ces étiquettes au sein des groupes n'a pas d'importance. – wligtenberg

Répondre

3

Comme de g gplot2 2.x cette approche est malheureusement cassée.

Le code suivant fournit exactement ce que je voulais, avec quelques calculs supplémentaires à l'avant:

library(ggplot2) 
library(data.table) 

orderX <- c("A" = 1, "B" = 2, "C" = 3) 
y <- rnorm(20) 
x <- as.character(1:20) 
group <- c(rep("A", 5), rep("B", 7), rep("C", 5), rep("A", 3)) 
dt <- data.table(x, y, group) 
dt[, lvls := as.numeric(orderX[group])] 
dt[, average := mean(y), by = group] 
dt[, x := reorder(x, lvls)] 
dt[, xbegin := names(which(attr(dt$x, "scores") == unique(lvls)))[1], by = group] 
dt[, xend := names(which(attr(dt$x, "scores") == unique(lvls)))[length(x)], by = group] 

ggplot(data = dt, aes(x=x, y=y)) + 
    geom_point(aes(colour = group)) + 
    facet_grid(.~group,space="free",scales="free_x") + 
    geom_segment(aes(x = xbegin, xend = xend, y = average, yend = average, group = group, colour = group)) 

L'image résultante:

enter image description here

+3

Je ne suis pas sûr si cela aidera dans votre situation exacte, mais le nouvelle solution que j'ai trouvé avec ggplot2 v2.1.0 pour un problème similaire est 'stat_summary (fun.y =" signifie ", fun.ymin =" signifie ", fun.ymax =" signifie ", taille = 0.3, geom =" barre transversale ") '. –

+0

J'ai essayé cela, qui crée des lignes horizontales par article sur l'axe des x. La raison en est que l'axe des abscisses est discret. – wligtenberg

16

De votre question, je ne sais pas si df$x est pertinent pour vos données, surtout si vous pouvez le commander à nouveau. Que diriez-vous simplement en utilisant group comme x, et jitter la position réelle de x pour séparer les points:

ggplot(data=df, aes(x=group,y=y,color=group)) + geom_point() + 
geom_jitter(position = position_jitter(width = 0.4)) + 
geom_errorbar(stat = "hline", yintercept = "mean", 
    width=0.8,aes(ymax=..y..,ymin=..y..)) 

Je l'ai utilisé errorbar au lieu de h_line (et l'effondrement ymax et ymin à y) depuis hline est complexe. Si quelqu'un a une meilleure solution à cette partie, j'aimerais voir.

alt text


mise à jour

Si vous voulez préserver l'ordre de X, essayez cette solution (avec X modifiée)

df$x = factor(df$x) 

ggplot(data = df, aes(x, y, group=group)) + 
facet_grid(.~group,space="free",scales="free_x") + 
geom_point() + 
geom_line(stat = "hline", yintercept = "mean") 

alt text

+0

C'est en effet presque ce que je veux, cependant, je veux être en mesure de voir les valeurs x d'origine sur l'échelle x. – wligtenberg

+0

Lorsque vous effectuez la nouvelle commande ci-dessus, vos données sont mélangées. Vous devez trier sur le bloc de données d'origine, pas seulement les valeurs x. Voulez-vous que les valeurs x soient entrelacées dans votre graphique? Si oui, où voulez-vous placer les valeurs moyennes? –

+0

Où avez-vous trouvé la documentation sur geom_line (stat = "hline", yintercept = "mean")? C'est vraiment cool et je ne l'ai jamais vu auparavant. –