GGplot avec plusieurs dataframe

Postez ici vos questions, réponses, commentaires ou suggestions - Les sujets seront ultérieurement répartis dans les archives par les modérateurs

Modérateur : Groupe des modérateurs

Guillaume Dramais
Messages : 39
Enregistré le : 25 Sep 2018, 00:04

GGplot avec plusieurs dataframe

Messagepar Guillaume Dramais » 03 Mai 2019, 06:19

Bonjour,

Je me demande si l'on peut utiliser plusieurs dataframe dans un graph GGplot. Voilà mon exemple :

Code : Tout sélectionner

library(dplyr)
library(tidyr)
library(ggplot2)


toto<-cbind(c(0,1,3,8,12,14),
            c(1,1.5,3,2.5,1,0.8),
            c(0.1,0.12,0.14,0.18,0.13,0.1))

toto<-as.data.frame(toto)
colnames(toto)<-c("distance","depth","concentration")

Ntest<-cbind(c(0,2,5,7,15),
             c(2,1.5,0,0.5,2.2))

Ntest<-as.data.frame(Ntest)
colnames(Ntest)<-c("distance","Bdepth")


p = ggplot(toto, aes(x = distance, y = depth, z = concentration)) +
 
  scale_y_reverse() +
  stat_summary_2d(bins = 2) + #BIns to adjust depending on the ADCP dataset (40 for 22/01, 20 for 23/01)
  scale_fill_gradientn(colours = rainbow(5)) +
  labs(y = "Depth [m]", x = "Distance [m]", z="Concentration")+
  guides(fill=guide_legend(title="Concentration
  [mg/L]")) +
  theme(legend.title = element_text(colour="black", size=10))+
  ggtitle("Mon exemple reproductible")+ 
  theme(plot.title = element_text(hjust = 0.5, size=18))+                 

  geom_line(aes(distance, depth), colour="brown", size=1.5,show.legend = FALSE)#+
 
  #geom_col(data=Ntest,mapping=aes(x=distance, y=Bdepth))

p


J'arrive à tracer mon premier dataframe "toto" sans problème. Je voudrais ensuite masquer une partie de mon graph en ajoutant un graph en barre, geom_bar, geom_col ou geom_area, il y a apparemment beaucoup de possibilités. Pour cela j’introduis un deuxième data.frame "Ntest" dont les données sont "compatibles" avec mon graphe mais pas forcement de même taille.
Et là j'ai essayé plusieurs positions et réglages mais je n'arrive pas à afficher quelque chose à partir de ce deuxième data.frame.

Auriez vous des conseils, des pistes?

Merci d'avance
Guillaume

Pierre-Yves Berrard
Messages : 1029
Enregistré le : 12 Jan 2016, 23:30

Re: GGplot avec plusieurs dataframe

Messagepar Pierre-Yves Berrard » 03 Mai 2019, 07:33

Bonjour,

Comme le message d'erreur mentionnait la variable concentration, je l'ai sortie du mappping global pour la mettre dans le mapping de stat_summary_2d :

Code : Tout sélectionner

ggplot(toto, aes(x = distance, y = depth)) +
  stat_summary_2d(mapping = aes(z = concentration), bins = 2) + ....

Ça semble fonctionner. Par contre je ne saurais pas dire exactement pourquoi...

PS : pour créer un data.frame en une instruction (et sans risque d'erreur) :

Code : Tout sélectionner

toto <- data.frame(
  distance = c(0, 1, 3, 8, 12, 14),
  depth = c(1, 1.5, 3, 2.5, 1, 0.8),
  concentration = c(0.1, 0.12, 0.14, 0.18, 0.13, 0.1)
)
PY

Logez Maxime
Messages : 3138
Enregistré le : 26 Sep 2006, 11:35

Re: GGplot avec plusieurs dataframe

Messagepar Logez Maxime » 03 Mai 2019, 08:36

Bonjour,

Les aesthetics qui sont utilisés dans la fonction ggplot sont passés à tous les layers, voir https://ggplot2.tidyverse.org/reference/aes.html.
Du coup je pense que dans le geom_col il va chercher une colonne concentration a Ntest qu'il ne trouve pas d'où le message d'erreur. D'ailleurs si tu ajoutes une colonne concentration a Ntest avec des valeurs bidons, par exemple 0, alors le code fonctionne.

A priori il faut plutôt réserver les aesthetics qui sont propres à chaque layer dans les fonctions geom, comme l'a fait Pierre-Yves, et ne mettre dans la fonction ggplot que les aesthetics qui vont être commun entre tous les layers. Sinon dans le layer en question il te faut spécifier inherit.aes = FALSE et spécifier spécifiquement les aesthetics.

Code : Tout sélectionner

p + geom_col(data = Ntest, mapping = aes(x=distance, y = Bdepth), inherit.aes= FALSE)


Cordialement,
Maxime

Guillaume Dramais
Messages : 39
Enregistré le : 25 Sep 2018, 00:04

Re: GGplot avec plusieurs dataframe

Messagepar Guillaume Dramais » 05 Mai 2019, 14:22

Bonjour,
Merci, effectivement ça marche et je comprend mieux.
Par contre je voulais tracer le graph en barre en partant du bas, pour masquer ce qui est en dessous de la courbe

J'ai essayé de créer un second axes des ordonnées, j'y arrive,

Code : Tout sélectionner

scale_y_continuous(sec.axis = sec_axis(~.*-1))+

mais la commande n'a pas l'air compatible avec la première inversion d'axe

Code : Tout sélectionner

scale_y_reverse() +


Code : Tout sélectionner

p = ggplot(toto, aes(x = distance, y = depth, z = concentration)) +
 
  scale_y_reverse() +
  stat_summary_2d(bins = 2) + #BIns to adjust depending on the ADCP dataset (40 for 22/01, 20 for 23/01)
  scale_fill_gradientn(colours = rainbow(5)) +
  labs(y = "Depth [m]", x = "Distance [m]", z="Concentration")+
  guides(fill=guide_legend(title="Concentration
                           [mg/L]")) +
  theme(legend.title = element_text(colour="black", size=10))+
  ggtitle("Mon exemple reproductible")+
  theme(plot.title = element_text(hjust = 0.5, size=18))+                 
 
  geom_line(aes(distance, depth), colour="brown", size=1.5, inherit.aes = FALSE)+
#  scale_y_continuous(sec.axis = sec_axis(~.*1))+
geom_col(data = Ntest, mapping = aes(x=distance, y = Bdepth), inherit.aes= FALSE)

p


J'ai essayé aussi les fonctions geom_area, geom_col, mais les tracés partent toujours du même axe.

Une solution plus simple sans passer par un deuxieme axe et un deuxième jeu de données pourrait être de remplir l'aire au dessus de la courbe (en dessous sur le graph) que je trace avec geom_line. Mais je n'ai pas trouvé d'exemples avec ce genre de tracé.
Auriez vous une piste ?

merci
Guillaume

Guillaume Dramais
Messages : 39
Enregistré le : 25 Sep 2018, 00:04

Resolu: GGplot avec plusieurs dataframe

Messagepar Guillaume Dramais » 06 Mai 2019, 16:42

Bonjour,
J'ai trouvé une solution pour mon masque avec geom_polypath en adaptant l'exemple ci dessous à mon jeu de données

https://stackoverflow.com/questions/51715907/how-to-apply-a-clipping-mask-to-geom-in-a-ggplot

Cordialement
Guillaume


Retourner vers « Questions en cours »

Qui est en ligne

Utilisateurs parcourant ce forum : Google [Bot] et 1 invité