bagan garis ggplot2 memberikan “geom_path: Setiap grup hanya terdiri dari satu pengamatan. Apakah Anda perlu menyesuaikan estetika grup? "


170

Dengan kerangka data ini ("df"):

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

Saya mencoba membuat bagan garis seperti ini:

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

Kesalahan yang saya dapatkan adalah:

geom_path: Setiap grup hanya terdiri dari satu pengamatan. Apakah Anda perlu menyesuaikan estetika grup?

Bagan muncul sebagai sebaran plot meskipun saya ingin bagan garis. Saya mencoba untuk mengganti geom_line()dengan geom_line(aes(group = year))tetapi itu tidak berhasil.

Dalam jawaban saya diberitahu untuk mengubah tahun menjadi variabel faktor. Saya lakukan dan masalahnya tetap ada. Ini adalah output dari str(df)dan 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")

Tidak ada kesalahan saat saya menjalankannya. Sepertinya dfbukan itu yang Anda pikirkan. Silakan sebutkan pertanyaan Anda dalam bentuk yang dapat direproduksi, yaitu tunjukkan hasil dari dput(df).
G. Grothendieck

Bisa jadi variabel Anda adalah faktor, maka Anda harus mengubahnya menjadi numerik
bit

@Grothendieck, saya memposting apa yang Anda katakan. Saya juga mengonversi ke angka dan masih memiliki masalah.
megashigger

Anda benar-benar harus menyatakan pertanyaan dalam bentuk yang dapat direproduksi. Sulit membantu Anda jika kami tidak dapat membuat ulang kesalahan.
Mario Becerra

Jawaban:


344

Anda hanya perlu menambahkan group = 1ke ggplot atau geom_line aes ().

Untuk grafik garis, titik data harus dikelompokkan sehingga mengetahui titik mana yang harus disambungkan. Dalam hal ini, ini sederhana - semua titik harus terhubung, jadi grup = 1. Ketika lebih banyak variabel digunakan dan beberapa garis digambar, pengelompokan untuk garis biasanya dilakukan oleh variabel.

Referensi: Cookbook untuk R, Bab: Grafik Bar_and_line_graphs_ (ggplot2), Grafik garis.

Coba ini:

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

Sebagai catatan, pengelompokan harus dilakukan dengan groupargumen. Pengelompokan saja misalnya dengan colortidak akan mencukupi. Saya baru saja mengalami masalah ini dan berharap ini membantu seseorang mengalami hal yang sama
Tjebo

apakah jawaban ini masih valid? Menambahkan grup = 1 dalam estetika tampaknya tidak berfungsi lagi.
Giacomo

@ Giacomo - bekerja untuk saya, pada 3.6.2 di Mac. Sudah mendapatkan peringatan yang ditakuti, tetapi menambahkan grup = 1 memperbaiki masalah. ggplot (lakemeta, mapping = aes (x = Lake, y = Area, group = 1)) + geom_line (size = 2, color = "blue")
Jenn D.

27

Anda mendapatkan kesalahan ini karena salah satu variabel Anda sebenarnya adalah variabel faktor. Menjalankan

str(df) 

untuk memeriksanya. Kemudian lakukan perubahan variabel ganda ini untuk mempertahankan angka tahun alih-alih berubah menjadi angka level "1,2,3,4":

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

EDIT: tampaknya data.frame Anda memiliki variabel "array" kelas yang mungkin menyebabkan pb. Cobalah:

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

dan plot lagi?


3
Bagi saya ini adalah jawaban yang mudah karena itu memperbaiki masalah dari root
Medhat

1
Jawaban yang bagus untuk mencegah peringatan ini!
Mihai

2

Saya punya masalah serupa dengan bingkai data:

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

Saya pikir variabel untuk sumbu x harus numerik, sehingga geom_line tahu cara menghubungkan titik-titik untuk menggambar garis.

setelah saya mengubah kolom ke-2 menjadi numerik:

 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

lalu bekerja.


1

Mulai R dalam sesi baru dan tempel ini di:

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

Mulai R dalam sesi baru dan rekatkan kode di posting saya ke dalamnya.
G. Grothendieck

Sudahkah Anda menemukan masalah ini? Saya memiliki masalah yang sama dengan Anda yang hanya memiliki satu nilai untuk setiap nilai x. Menunggu tanggapan Anda. Terima kasih.
Hoang Le

0

Saya mendapat prompt serupa. Itu karena saya telah menentukan sumbu x dalam beberapa persentase (misalnya: 10% A, 20% B, ....). Jadi pendekatan alternatif bisa jadi Anda mengalikan nilai-nilai ini dan menulisnya dalam bentuk paling sederhana.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.