Expliquer l'avertissement de ggplot2: "K lignes supprimées contenant des valeurs manquantes"

89

J'obtiens cet avertissement lorsque j'essaye de générer un tracé avec ggplot .

Après des recherches en ligne pendant un certain temps, beaucoup ont suggéré que ma base de données contenait des valeurs nulles ou des données manquantes en général, ce qui n'était pas le cas.

Dans cette question, la réponse acceptée dit ce qui suit:

L'avertissement signifie que certains éléments sont supprimés car ils tombent en dehors de la plage spécifiée

Je me demandais à quoi exactement cette plage se réfère et comment quelqu'un peut-il augmenter manuellement cette plage afin d'éviter tous les avertissements?

ksm001
la source
5
Il y a une limite sur l' yaxe sur cette question. Les valeurs sont limitées entre 0 et 0,12 à cause de cette fonction:ylim(0,0.12)
LyzandeR
1
Un exemple reproductible aiderait à répondre à la question. @LyzandeR semble s'engager dans la bonne voie.
vpipkt

Réponses:

85

Le comportement que vous voyez est dû à la façon dont ggplot2traite les données qui sont en dehors des plages d'axes du tracé. Vous pouvez modifier ce comportement selon que vous utilisez scale_y_continuous(ou, de manière équivalente ylim) ou coord_cartesianpour définir des plages d'axes, comme expliqué ci-dessous.

library(ggplot2)

# All points are visible in the plot
ggplot(mtcars, aes(mpg, hp)) + 
  geom_point()

Dans le code ci-dessous, un point avec hp = 335 est en dehors de la plage y du graphique. De plus, comme nous avions l'habitude scale_y_continuousde définir la plage de l'axe y, ce point n'est inclus dans aucune autre statistique ou mesure récapitulative calculée par ggplot, telle que la ligne de régression linéaire.

ggplot(mtcars, aes(mpg, hp)) + 
  geom_point() +
  scale_y_continuous(limits=c(0,300)) +  # Change this to limits=c(0,335) and the warning disappars
  geom_smooth(method="lm")

Warning messages:
1: Removed 1 rows containing missing values (stat_smooth). 
2: Removed 1 rows containing missing values (geom_point).

Dans le code ci-dessous, le point avec hp = 335 est toujours en dehors de la plage y du graphique, mais ce point est néanmoins inclus dans toutes les statistiques ou mesures récapitulatives calculées par ggplot, telles que la ligne de régression linéaire. C'est parce que nous avons utilisécoord_cartesian de définir la plage de l'axe y, et cette fonction n'exclut pas les points qui sont en dehors des plages de tracé lorsqu'elle effectue d'autres calculs sur les données.

Si vous comparez ce graphique et le précédent, vous pouvez voir que la droite de régression linéaire dans le deuxième graphique a une pente légèrement plus raide, car le point avec hp = 335 est inclus lors du calcul de la droite de régression, même s'il n'est pas visible dans le graphique .

ggplot(mtcars, aes(mpg, hp)) + 
  geom_point() +
  coord_cartesian(ylim=c(0,300)) +
  geom_smooth(method="lm")
eipi10
la source
11

Juste pour le shake complétant la réponse donnée par eipi10.

J'étais confronté au même problème, sans utiliser scale_y_continuousni coord_cartesian.

Le conflit provenait de l'axe des x, où j'ai défini limits = c(1, 30). Il semble que ces limites ne fournissent pas assez d'espace si vous voulez "esquiver" vos barres, donc R lève toujours l'erreur

Suppression de 8 lignes contenant des valeurs manquantes (geom_bar)

Ajuster les limites de l'axe x pour limits = c(0, 31)résoudre le problème.

En conclusion, même si vous ne mettez pas de limites à votre axe y, vérifiez le comportement de votre axe x pour vous assurer que vous disposez de suffisamment d'espace

Davidnortes
la source
C'est si souvent oublié. Par la même personne. Encore une fois après un certain temps ... soupir Merci!
Genom
1

Même si vos données tombent dans les limites spécifiées (par exemple c(0, 335)), l'ajout d'une geom_jitter()instruction pourrait pousser certains points en dehors de ces limites, produisant le même message d'erreur.

library(ggplot2)

range(mtcars$hp)
#> [1]  52 335

# No jitter -- no error message
ggplot(mtcars, aes(mpg, hp)) + 
    geom_point() +
    scale_y_continuous(limits=c(0,335))


# Jitter is too large -- this generates the error message
ggplot(mtcars, aes(mpg, hp)) + 
    geom_point() +
    geom_jitter(position = position_jitter(w = 0.2, h = 0.2)) +
    scale_y_continuous(limits=c(0,335))
#> Warning: Removed 1 rows containing missing values (geom_point).

Créé le 2020-08-24 par le package reprex (v0.3.0)

Todd
la source
0

J'ai rencontré cela aussi, mais dans le cas où je voulais éviter les messages d'erreur supplémentaires tout en gardant la plage fournie. Une option consiste également à sous-ensembles les données avant de définir la plage, afin que la plage puisse être conservée comme vous le souhaitez sans déclencher d'avertissements.

library(ggplot2)

range(mtcars$hp)
#> [1]  52 335

# Setting limits with scale_y_continous (or ylim) and subsetting accordingly
## avoid warning messages about removing data
ggplot(data= subset(mtcars, hp<=300 & hp >= 100), aes(mpg, hp)) + 
  geom_point() +
  scale_y_continuous(limits=c(100,300))
Rob
la source