Das Liniendiagramm von ggplot2 gibt „geom_path: Jede Gruppe besteht nur aus einer Beobachtung. Müssen Sie die Gruppenästhetik anpassen? “


170

Mit diesem Datenrahmen ("df"):

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

Ich versuche ein Liniendiagramm wie folgt zu erstellen:

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

Der Fehler, den ich bekomme, ist:

geom_path: Jede Gruppe besteht nur aus einer Beobachtung. Müssen Sie die Gruppenästhetik anpassen?

Das Diagramm wird als Streudiagramm angezeigt, obwohl ich ein Liniendiagramm möchte. Ich habe versucht , ersetzen geom_line()mit , geom_line(aes(group = year))aber das hat nicht funktioniert.

In einer Antwort wurde mir gesagt, ich solle das Jahr in eine Faktorvariable umwandeln. Ich habe es getan und das Problem bleibt bestehen. Dies ist die Ausgabe von str(df)und 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")

Es gibt keinen Fehler, wenn ich es ausführe. Es ist wahrscheinlich dfnicht das, was Sie denken. Bitte geben Sie Ihre Frage in reproduzierbarer Form an, dh zeigen Sie die Ausgabe von dput(df).
G. Grothendieck

könnte sein, dass Ihre Variablen Faktoren sind, dann müssten Sie sie in numerische
Rote Beete

@ G.Grothendieck Ich habe gepostet, was du gesagt hast. Ich habe auch auf numerisch konvertiert und habe immer noch das Problem.
Megashigger

Sie sollten wirklich Fragen in reproduzierbarer Form stellen. Es ist schwer, Ihnen zu helfen, wenn wir den Fehler nicht wiederherstellen können.
Mario Becerra

Antworten:


344

Sie müssen nur group = 1ggplot oder geom_line aes () hinzufügen .

Bei Liniendiagrammen müssen die Datenpunkte so gruppiert werden, dass sie wissen, welche Punkte verbunden werden sollen. In diesem Fall ist es einfach - alle Punkte sollten verbunden sein, also Gruppe = 1. Wenn mehr Variablen verwendet und mehrere Linien gezeichnet werden, erfolgt die Gruppierung für Linien normalerweise nach Variablen.

Referenz: Kochbuch für R, Kapitel: Diagramme Bar_and_line_graphs_ (ggplot2), Liniendiagramme.

Versuche dies:

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

Zu beachten ist, dass die Gruppierung mit dem groupArgument erfolgen muss. Eine Gruppierung nur zB nach colorwürde nicht ausreichen.
Ich

Ist diese Antwort noch gültig? Das Hinzufügen von group = 1 in der Ästhetik scheint nicht mehr zu funktionieren.
Giacomo

@ Giacomo - funktioniert für mich unter 3.6.2 auf einem Mac. Ich habe die gefürchtete Warnung erhalten, aber das Hinzufügen von group = 1 hat das Problem behoben. ggplot (lakemeta, Mapping = aes (x = See, y = Fläche, Gruppe = 1)) + geom_line (Größe = 2, Farbe = "blau")
Jenn D.

27

Sie erhalten diesen Fehler, weil eine Ihrer Variablen tatsächlich eine Faktorvariable ist. Ausführen

str(df) 

um dies zu überprüfen. Führen Sie dann diese doppelte Variablenänderung durch, um die Jahreszahlen beizubehalten, anstatt sie in "1,2,3,4" -Niveaus umzuwandeln:

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

BEARBEITEN: Es scheint, dass Ihr data.frame eine Variable der Klasse "array" hat, die die pb verursachen kann. Versuchen Sie dann:

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

und wieder planen?


3
Dies ist für mich eine bequeme Antwort, da es das Problem von der Wurzel
Medhat

1
Gute Antwort, um diese Warnung zu verhindern!
Mihai

2

Ich hatte ein ähnliches Problem mit dem Datenrahmen:

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

Ich denke, die Variable für die x-Achse sollte numerisch sein, damit geom_line weiß, wie man die Punkte verbindet, um die Linie zu zeichnen.

nachdem ich die 2. Spalte in numerisch geändert habe:

 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

dann funktioniert es.


1

Starten Sie R in einer neuen Sitzung und fügen Sie diese ein:

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

Starten Sie R in einer neuen Sitzung und fügen Sie den Code in meinem Beitrag ein.
G. Grothendieck

Haben Sie dieses Problem herausgefunden? Ich habe das gleiche Problem wie Sie, ich habe nur einen Wert für jeden x-Wert. Warte auf deine Antwort. Vielen Dank.
Hoang Le

0

Ich habe eine ähnliche Aufforderung erhalten. Das lag daran, dass ich die x-Achse in Prozent angegeben hatte (zum Beispiel: 10% A, 20% B, ....). Ein alternativer Ansatz könnte also sein, dass Sie diese Werte multiplizieren und in der einfachsten Form schreiben.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.