Wykres liniowy ggplot2 podaje „geom_path: Każda grupa składa się tylko z jednej obserwacji. Czy potrzebujesz dostosować estetykę grupy? ”


170

Z tą ramką danych („df”):

year pollution
1 1999 346.82000
2 2002 134.30882
3 2005 130.43038
4 2008  88.27546

Próbuję stworzyć taki wykres liniowy:

  plot5 <- ggplot(df, aes(year, pollution)) +
           geom_point() +
           geom_line() +
           labs(x = "Year", y = "Particulate matter emissions (tons)", title = "Motor vehicle emissions in Baltimore")

Otrzymuję błąd:

geom_path: każda grupa składa się tylko z jednej obserwacji. Potrzebujesz dostosować estetykę grupy?

Wykres pojawia się jako wykres punktowy, mimo że chcę mieć wykres liniowy. Starałem się wymienić geom_line()z geom_line(aes(group = year))ale to nie działa.

W odpowiedzi powiedziano mi, żebym przeliczył rok na zmienną czynnikową. Zrobiłem i problem nadal występuje. Oto wynik działania str(df)i dput(df):

'data.frame':   4 obs. of  2 variables:
 $ year     : num  1 2 3 4
 $ pollution: num [1:4(1d)] 346.8 134.3 130.4 88.3
  ..- attr(*, "dimnames")=List of 1
  .. ..$ : chr  "1999" "2002" "2005" "2008"

structure(list(year = c(1, 2, 3, 4), pollution = structure(c(346.82, 
134.308821199349, 130.430379885892, 88.275457392443), .Dim = 4L, .Dimnames = list(
    c("1999", "2002", "2005", "2008")))), .Names = c("year", 
"pollution"), row.names = c(NA, -4L), class = "data.frame")

Po uruchomieniu nie wyświetla żadnego błędu. Prawdopodobnie dfnie jest to to, o czym myślisz. Proszę podać swoje pytanie w powtarzalnej formie, tj. Pokazać wynik dput(df).
G. Grothendieck

może być, że twoje zmienne są czynnikami, wtedy musisz je przekonwertować na liczbowe
burak ćwikłowy

@ G.Grothendieck Opublikowałem to, co powiedziałeś. Przekonwertowałem również na numeryczny i nadal mam problem.
megashigger

Naprawdę powinieneś zadawać pytania w powtarzalnej formie. Trudno Ci pomóc, jeśli nie możemy odtworzyć błędu.
Mario Becerra

Odpowiedzi:


344

Musisz tylko dodać group = 1do ggplot lub geom_line aes ().

W przypadku wykresów liniowych punkty danych muszą być pogrupowane, aby wiedział, które punkty połączyć. W tym przypadku sprawa jest prosta - wszystkie punkty powinny być połączone, więc grupa = 1. Gdy używanych jest więcej zmiennych i rysowanych jest wiele linii, grupowanie linii jest zwykle wykonywane za pomocą zmiennej.

Źródła : Książka kucharska dla języka R, rozdział: Wykresy Bar_and_line_graphs_ (ggplot2), Wykresy liniowe.

Spróbuj tego:

plot5 <- ggplot(df, aes(year, pollution, group = 1)) +
         geom_point() +
         geom_line() +
         labs(x = "Year", y = "Particulate matter emissions (tons)", 
              title = "Motor vehicle emissions in Baltimore")

Warto zauważyć, że grupowanie należy przeprowadzić z groupargumentem. Grupowanie tylko np. color
Według

czy ta odpowiedź jest nadal aktualna? Dodanie grupy = 1 w estetyce wydaje się już nie działać.
Giacomo

@Giacomo - działa dla mnie na 3.6.2 na Macu. Otrzymałem przerażające ostrzeżenie, ale dodanie grupy = 1 rozwiązało problem. ggplot (lakemeta, mapping = aes (x = jezioro, y = obszar, grupa = 1)) + geom_line (rozmiar = 2, kolor = "niebieski")
Jenn D.

27

Otrzymujesz ten błąd, ponieważ jedna z twoich zmiennych jest w rzeczywistości zmienną czynnikową. Wykonać

str(df) 

żeby to sprawdzić. Następnie wykonaj tę podwójną zmianę zmiennej, aby zachować numery lat zamiast przekształcać się w liczby poziomów „1,2,3,4”:

df$year <- as.numeric(as.character(df$year))

EDYCJA: wygląda na to, że twoja data.frame ma zmienną klasy "tablica", która może powodować pb. Spróbuj więc:

df <- data.frame(apply(df, 2, unclass))

i znowu spiskować


3
To dla mnie wygodna odpowiedź, ponieważ rozwiązuje problem z korzenia
Medhat

1
Dobra odpowiedź, aby zapobiec temu ostrzeżeniu!
Mihai

2

Miałem podobny problem z ramką danych:

group time weight.loss
1 Control  wl1    4.500000
2    Diet  wl1    5.333333
3  DietEx  wl1    6.200000
4 Control  wl2    3.333333
5    Diet  wl2    3.916667
6  DietEx  wl2    6.100000
7 Control  wl3    2.083333
8    Diet  wl3    2.250000
9  DietEx  wl3    2.200000

Myślę, że zmienna dla osi x powinna być numeryczna, aby geom_line wiedział, jak połączyć punkty, aby narysować linię.

po zmianie drugiej kolumny na numeryczną:

 group time weight.loss
1 Control    1    4.500000
2    Diet    1    5.333333
3  DietEx    1    6.200000
4 Control    2    3.333333
5    Diet    2    3.916667
6  DietEx    2    6.100000
7 Control    3    2.083333
8    Diet    3    2.250000
9  DietEx    3    2.200000

wtedy to działa.


1

Uruchom R w nowej sesji i wklej to w:

library(ggplot2)

df <- structure(list(year = c(1, 2, 3, 4), pollution = structure(c(346.82, 
134.308821199349, 130.430379885892, 88.275457392443), .Dim = 4L, .Dimnames = list(
    c("1999", "2002", "2005", "2008")))), .Names = c("year", 
"pollution"), row.names = c(NA, -4L), class = "data.frame")

df[] <- lapply(df, as.numeric) # make all columns numeric

ggplot(df, aes(year, pollution)) +
           geom_point() +
           geom_line() +
           labs(x = "Year", 
                y = "Particulate matter emissions (tons)", 
                title = "Motor vehicle emissions in Baltimore")

Uruchom R w nowej sesji i wklej do niej kod z mojego postu.
G. Grothendieck

Rozwiązałeś ten problem. Mam ten sam problem z twoim, ponieważ mam tylko jedną wartość dla każdej wartości x. Czekam na Twoją odpowiedź. Dzięki.
Hoang Le

0

Otrzymałem podobny monit. To dlatego, że określiłem oś x w procentach (na przykład: 10% A, 20% B, ...). Zatem alternatywnym podejściem może być pomnożenie tych wartości i zapisanie ich w najprostszej formie.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.