Wyjaśnij ostrzeżenie ggplot2: „Usunięto k wierszy zawierających brakujące wartości”

89

Otrzymuję to ostrzeżenie, gdy próbuję wygenerować fabułę za pomocą ggplot.

Po pewnym czasie wyszukiwania w Internecie wielu zasugerowało, że moja baza danych zawiera wartości null lub ogólnie brakuje danych, co nie miało miejsca.

W tym pytaniu przyjęta odpowiedź brzmi:

Ostrzeżenie oznacza, że ​​niektóre elementy są usuwane, ponieważ wypadają poza podany zakres

Zastanawiałem się, do czego dokładnie odnosi się ten zakres i jak można ręcznie zwiększyć ten zakres, aby uniknąć wszelkich ostrzeżeń?

ksm001
źródło
5
yOś w tej kwestii jest ograniczona . Ze względu na tę funkcję wartości są ograniczone od 0 do 0,12:ylim(0,0.12)
LyzandeR
1
Powtarzalny przykład pomógłby odpowiedzieć na pytanie. @LyzandeR wydaje się podążać właściwą ścieżką.
vpipkt

Odpowiedzi:

85

Zachowanie, które widzisz, wynika z tego, jak ggplot2radzi sobie z danymi, które znajdują się poza zakresami osi wykresu. Możesz zmienić to zachowanie w zależności od tego, czy używasz scale_y_continuous(lub równoważnie ylim), czy coord_cartesianteż ustawiasz zakresy osi, jak wyjaśniono poniżej.

library(ggplot2)

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

W poniższym kodzie jeden punkt z hp = 335 jest poza zakresem y wykresu. Ponadto, ponieważ wcześniej scale_y_continuousustawialiśmy zakres osi Y, ten punkt nie jest uwzględniany w żadnych innych statystykach ani miarach sumarycznych obliczanych przez ggplot, takich jak linia regresji liniowej.

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).

W poniższym kodzie punkt z hp = 335 nadal znajduje się poza zakresem y wykresu, ale mimo to ten punkt jest uwzględniany we wszelkich statystykach lub miarach sumarycznych obliczanych przez ggplot, takich jak linia regresji liniowej. Dzieje się tak, ponieważ wcześniej coord_cartesianustawialiśmy zakres osi Y, a ta funkcja nie wyklucza punktów, które znajdują się poza zakresami wykresu, gdy wykonuje inne obliczenia na danych.

Jeśli porównasz ten i poprzedni wykres, zobaczysz, że linia regresji liniowej na drugim wykresie ma nieco bardziej strome nachylenie, ponieważ punkt o hp = 335 jest uwzględniany podczas obliczania linii regresji, mimo że nie jest widoczny na wykresie .

ggplot(mtcars, aes(mpg, hp)) + 
  geom_point() +
  coord_cartesian(ylim=c(0,300)) +
  geom_smooth(method="lm")
eipi10
źródło
11

Tylko dla potrząśnięcia uzupełniającego odpowiedź udzieloną przez eipi10.

Miałem ten sam problem, bez użycia scale_y_continuousnor coord_cartesian.

Konflikt pochodził z osi X, na której zdefiniowałem limits = c(1, 30). Wygląda na to, że takie limity nie zapewniają wystarczającej ilości miejsca, jeśli chcesz „omijać” paski, więc R nadal generuje błąd

Usunięto 8 wierszy zawierających brakujące wartości (geom_bar)

Dostosowanie granic osi x do limits = c(0, 31)rozwiązania problemu.

Podsumowując, nawet jeśli nie stawiasz granic swojej osi y, sprawdź zachowanie osi X, aby upewnić się, że masz wystarczająco dużo miejsca

davidnortes
źródło
To jest tak często pomijane. Ta sama osoba. Znowu po jakimś czasie ... westchnij Dzięki!
Genom
1

Nawet jeśli dane mieszczą się w określonych granicach (np. c(0, 335)), Dodanie geom_jitter()instrukcji może przesunąć niektóre punkty poza te granice, powodując ten sam komunikat o błędzie.

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).

Utworzony 2020-08-24 przez pakiet reprex (v0.3.0)

Todd
źródło
0

Wpadłem na to również, ale w przypadku, gdy chciałem uniknąć dodatkowych komunikatów o błędach, zachowując podany zakres. Opcją jest również podzbiór danych przed ustawieniem zakresu, aby zakres mógł być zachowany w dowolny sposób bez wyzwalania ostrzeżeń.

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))
Obrabować
źródło