J'ai un cadre de données assez énorme (près de 100 000 observations avec environ 40 variables) à partir duquel je veux que ggplot dessine des diagrammes de dispersion avec des lignes lm ou loess. Mais les lignes doivent être calculées uniquement sur la base d'un certain quantile des valeurs des variables de chaque date d'observation. Et je voudrais faire le filtrage ou le sous-ensemble directement dans ggplot sans créer un nouvel objet de données ou un sous-cadre de données à l'avance.
Comme mon cadre de données "réel" serait trop grand, j'ai créé un exemple fictif avec un cadre de données de 144 observations appelé df_Bandvals (Code à la fin de l'article).
Voici la structure suivante, les 25 premières lignes et un nuage de points avec une ligne de loess basée sur TOUTES les observations
> str(df_Bandvals)
'data.frame': 144 obs. of 5 variables:
$ obsdate : int 190101 190101 190101 190101 190101 190101 190101 190101 190101 190101 ...
$ transsect : chr "A" "A" "A" "A" ...
$ PointNr : num 1 2 3 4 5 6 1 2 3 4 ...
$ depth : num 31 31 31 31 31 31 31 31 31 31 ...
$ Band12plusmin: num 169 241 229 159 221 196 188 216 233 149 ...
> df_Bandvals
obsdate transsect PointNr depth Band12plusmin
1 190101 A 1 31 169
2 190101 A 2 31 241
3 190101 A 3 31 229
4 190101 A 4 31 159
5 190101 A 5 31 221
6 190101 A 6 31 196
7 190101 B 1 31 188
8 190101 B 2 31 216
9 190101 B 3 31 233
10 190101 B 4 31 149
11 190101 B 5 31 169
12 190101 B 6 31 181
13 190102 A 1 3 356
14 190102 A 2 3 368
15 190102 A 3 3 293
16 190102 A 4 3 261
17 190102 A 5 3 313
18 190102 A 6 3 374
19 190102 B 1 3 327
20 190102 B 2 3 409
21 190102 B 3 3 369
22 190102 B 4 3 334
23 190102 B 5 3 376
24 190102 B 6 3 318
25 190103 A 1 25 183
Le graphique montre profondeur vs. Bande 12plusmin avec une ligne de loess correspondante. Les couleurs des points sont attribuées à la date d'observation respective ( date d'obsolescence ). Chaque date d'observation comprend 12 observations.
Maintenant, ma question de base était : Comment obtenir une ligne de loess basée uniquement sur le quantile inférieur de 50 % ? Bande 12plusmin -valeurs de chaque date d'observation ? Ou en d'autres termes, en se référant au graphique : ggplot ne devrait utiliser que les 6 points inférieurs de chaque couleur pour calculer la ligne.
Et comme mentionné précédemment, j'aimerais effectuer le filtrage ou le sous-ensemble directement dans ggplot sans créer un nouvel objet de données ou un sous-cadre de données à l'avance.
J'ai essayé d'utiliser des sous-ensembles, mais mon problème dans ce cas est que je ne peux pas simplement spécifier une valeur universelle. Bande 12plusmin -car, bien entendu, le seuil de 50 % diffère individuellement pour chaque entreprise. date d'obsolescence -groupe. Je suis assez novice en matière de R et de ggplot, donc, pour l'instant, je n'ai pas réussi à trouver une solution pour ce filtrage de type class-individual-derived-threshold-conditionned. Quelqu'un peut-il m'aider ?
Voici le code du dataframe et du plot
obsdate<-rep(c(190101:190112),each=12, mode=factor)
transsect<-rep(rep(c("A","B"), each=6), 12)
PointNr<-rep(c(1,2,3,4,5,6), times=24)
depth<-rep(c(31,3,25,-9,13,18,7,-10,3,-4,11,21),each=12)
Band12<-rep(c(199,349,225,844,257,231,301,875,378,521,210,246), each=12)
set.seed(13423)
plusminRandom<-round(rnorm(144, mean=0, sd=33))
plusminRandom
Band12plusmin<-Band12+plusminRandom
df_Bandvals<-data.frame(obsdate, transsect, PointNr, depth, Band12plusmin)
str(df_Bandvals)
head(df_Bandvals, 20)
library (ggplot2)
ggplot(data=df_Bandvals, aes(x=depth, y=Band12plusmin))+
scale_x_continuous(limits = c(-15, 35))+
scale_y_continuous(limits = c(120, 960))+
geom_point(aes(color=factor(obsdate)), size=1.5)+
geom_smooth(method="loess")