2010-12-02 4 views
9

Je cherche un moyen de tracer un graphique à barres contenant deux séries différentes, cacher les barres pour l'une des séries et à la place avoir une ligne (lisse si possible) passer par le haut de l'endroit où les barres pour la série cachée auraient été (similaire à comment on pourrait superposer un polynôme freq sur un histogramme). J'ai essayé l'exemple ci-dessous mais semble rencontrer deux problèmes. D'abord, je dois résumer (total) les données par groupe, et deuxièmement, je voudrais convertir une des séries (df2) en une ligne.Comment une ligne peut-elle être superposée sur un graphique à barres en utilisant ggplot2?

df <- data.frame(grp=c("A","A","B","B","C","C"),val=c(1,1,2,2,3,3)) 
df2 <- data.frame(grp=c("A","A","B","B","C","C"),val=c(1,4,3,5,1,2)) 
ggplot(df, aes(x=grp, y=val)) + 
    geom_bar(stat="identity", alpha=0.75) + 
    geom_bar(data=df2, aes(x=grp, y=val), stat="identity", position="dodge") 

Répondre

11

Peut-être que vos données d'échantillons ne sont pas représentatifs des données réelles que vous travaillez avec, mais il n'y a pas de lignes à tirer pour df2. Il n'y a qu'une seule valeur pour chaque valeur x et y. Voici une version modifed de votre df2 avec des points de suffisamment de données pour construire des lignes:

df <- data.frame(grp=c("A","A","B","B","C","C"),val=c(1,2,3,1,2,3)) 
df2 <- data.frame(grp=c("A","A","B","B","C","C"),val=c(1,4,3,5,0,2)) 

p <- ggplot(df, aes(x=grp, y=val)) 
p <- p + geom_bar(stat="identity", alpha=0.75) 

p + geom_line(data=df2, aes(x=grp, y=val), colour="blue") 

Sinon, si vos données d'exemple ci-dessus est correct, vous pouvez tracer ces informations comme point avec geom_point(data = df2, aes(x = grp, y = val), colour = "red", size = 6). Vous pouvez évidemment changer la couleur et la taille à votre goût.

EDIT: En réponse au commentaire

Je ne suis pas tout à fait sûr de ce que le visuel pour un polynôme fréq sur un histogramme est censé ressembler. Les valeurs x sont-elles supposées être connectées les unes aux autres? Deuxièmement, vous continuez à faire référence à vouloir des lignes, mais votre code montre geom_bar() ce que je suppose n'est pas ce que vous voulez? Si vous voulez des lignes, utilisez geom_lines(). Si les deux hypothèses ci-dessus sont correctes, alors voici une approche pour le faire:

#First let's summarise df2 by group 
df3 <- ddply(df2, .(grp), summarise, total = sum(val)) 
> df3 
    grp total 
1 A  5 
2 B  8 
3 C  3 

#Second, let's plot df3 as a line while treating the grp variable as numeric 

p <- ggplot(df, aes(x=grp, y=val)) 
p <- p + geom_bar(alpha=0.75, stat = "identity") 
p + geom_line(data=df3, aes(x=as.numeric(grp), y=total), colour = "red") 
+0

En fait, je suis à la recherche d'un moyen de tracer essentiellement un diagrammes à barres contenant deux séries différentes, se cachent une des barres et à la place une ligne (lisse si possible) passer par le haut où les barres de la série cachée auraient été (de la même façon que l'on pourrait superposer un polynôme freq sur un histogramme). – user338714

+0

J'ai clarifié la question originale. Merci pour votre aide jusqu'à présent - il semble que je manque une étape pour d'abord résumer les données. – user338714

+0

@ user338714 - réponse mise à jour, je suis encore un peu peu clair ce que vous êtes vraiment après ici. Si ce que vous voulez n'est pas au-dessus, pouvez-vous trouver un exemple de l'image finale que vous aimeriez avoir? – Chase

17

Vous pouvez obtenir les totaux du groupe à bien des égards. L'un d'eux est

with(df, tapply(val, grp, sum)) 

Pour simplifier, vous pouvez combiner les données de bar et ligne en un seul jeu de données.

df_all <- data.frame(grp = factor(levels(df$grp))) 
df_all$bar_heights <- with(df, tapply(val, grp, sum)) 
df_all$line_y <- with(df2, tapply(val, grp, sum)) 

Les diagrammes à barres utilisent un axe x catégorique. Pour superposer une ligne, vous devrez convertir l'axe en numérique.

ggplot(df_all) + 
    geom_bar(aes(x = grp, weight = bar_heights)) + 
    geom_line(aes(x = as.numeric(grp), y = line_y)) 

enter image description here

+0

Belle réponse (+1)! J'aime cette approche. Je suppose que cela dépend de l'origine des données sources d'origine et de celles qui nécessiteront moins de codage. – Chase

Questions connexes