web-dev-qa-db-fra.com

Superposition de deux graphiques à l'aide de ggplot2 dans R

J'ai deux graphiques et j'essaie de superposer l'un sur l'autre:

Un exemple de la trame de données "ge" ressemble à ceci. En réalité, il y a 10 gènes avec 200 échantillons chacun, donc il y a 2000 lignes et 3 colonnes:

Exp    Gene    Sample
903.0   1       1
1060.0  1       2
786.0   1       3
736.0   1       4
649.0   2       1
657.0   2       2
733.5   2       3
774.0   2       4

Un exemple de la trame de données "avg" ressemble à ceci. Il s'agit d'une moyenne des points de données pour chaque gène dans tous les échantillons. En réalité, ce graphique a 10 gènes, donc la matrice est de 4col X 10 lignes:

mean       Gene   sd         se
684.2034    1   102.7142    7.191435
723.2892    2   100.6102    7.044122

Le premier graphique représente une ligne de l'expression moyenne pour chaque gène ainsi que l'écart type pour chaque point de données.

avggraph <- ggplot(avg, aes(x=Gene, y=mean)) + geom_point() +geom_line() + geom_errorbar(aes(ymin=mean-sd, ymax=mean+sd), width=.1)

Le deuxième graphique représente l'expression des gènes sous la forme d'une ligne pour chaque échantillon à travers tous les gènes.

linegraphs <- ggplot(ge, aes(x=Gene, y=Expression, group=Samples, colour="#000099")) + geom_line() + scale_x_discrete(limits=flevels.tge)

Je voudrais superposer avggraph au-dessus de linegraphs. Y a-t-il un moyen de faire cela? J'ai essayé avggraph + linegraphs mais je reçois une erreur. Je pense que c'est parce que les graphiques sont générés par deux trames de données différentes.

Je dois également souligner que les axes des deux graphiques sont identiques. Les deux graphiques ont les gènes sur l'axe X et l'expression des gènes sur l'axe Y.

Toute aide serait grandement appréciée!

24
Sheila

Une façon consiste à ajouter la commande geom_line Pour le deuxième tracé au premier tracé. Vous devez dire à ggplot que ce geom est basé sur un ensemble de données différent:

ggplot(avg, aes(x=Gene, y=mean)) + 
  geom_point() + 
  geom_line() + 
  geom_errorbar(aes(ymin=mean-sd, ymax=mean+sd), width=.1) +
  geom_line(data = ge, aes(x=Gene, y=Exp, group=Sample, colour="#000099"),
            show_guide = FALSE)

La dernière commande geom_line Sert à créer les lignes à partir des données brutes. enter image description here

23
Sven Hohenstein

La solution de contournement que j'ai trouvée était qu'au lieu de fusionner les deux tracés, j'ai fusionné les données. J'ai ajouté une colonne supplémentaire à la fin des deux trames de données, puis j'ai effectué l'opération rbind sur celles-ci en utilisant l'esthétique fill ou color pour séparer les deux tracés. Bien sûr, dans mon cas, l'échelle utilisée pour l'axe devait être la même.

2
ants.in.my.eyes