Лінійна діаграма ggplot2 дає „geom_path: Кожна група складається лише з одного спостереження. Чи потрібно коригувати естетику групи? "


170

За допомогою цього кадру даних ("df"):

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

Я намагаюся створити лінійну діаграму так:

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

Я отримую помилку:

geom_path: Кожна група складається лише з одного спостереження. Чи потрібно коригувати групову естетику?

Діаграма відображається як графік розкидання, хоча я хочу, щоб лінійна діаграма. Я намагався замінити geom_line()з , geom_line(aes(group = year))але це не спрацювало.

У відповіді мені сказали перетворити рік у факторну змінну. Я це зробив і проблема зберігається. Це вихід str(df)та 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")

Він не дає помилок, коли я запускаю його. Ймовірно, dfце не те, що ви думаєте, що це таке. Будь ласка, вкажіть своє запитання у відтворюваній формі, тобто покажіть результат dput(df).
Г. Гротендієк

може бути, що ваші змінні є факторами, тоді вам потрібно буде перетворити їх на числові
буряк

@ G.Grothendieck Я розмістив те, що ти сказав. Я також перейшов на числовий і все ще є проблема.
megashigger

Ви дійсно повинні ставити питання у відтворюваній формі. Важко вам допомогти, якщо ми не зможемо відтворити помилку.
Маріо Бесерра

Відповіді:


344

Вам потрібно лише додати group = 1в ggplot або geom_line aes ().

Для лінійних графіків точки даних повинні бути згруповані так, щоб вони знали, які точки підключити. У цьому випадку це просто - всі точки повинні бути з’єднані, тому група = 1. Коли використовується більше змінних і намальовано кілька ліній, групування для рядків зазвичай здійснюється за змінною.

Довідка: Кулінарна книга для R, Розділ: Графіки Bar_and_line_graphs_ (ggplot2), Лінійні графіки.

Спробуйте це:

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

Слід зазначити, що групування потрібно проводити за допомогою groupаргументу. Групування лише, наприклад, по colorне було б достатньо. У
мене

чи справді ця відповідь справедлива? Додавання групи = 1 в естетиці, схоже, вже не працює.
Джакомо

@Giacomo - працює для мене, 3.6.2 на Mac. Отримав жахливе попередження, але додавання групи = 1 вирішило проблему. ggplot (lakemeta, mapping = aes (x = Озеро, y = Площа, група = 1)) + geom_line (размер = 2, колір = "синій")
Джен Д.

27

Ви отримуєте цю помилку, оскільки одна із змінних насправді є змінною фактора. Виконати

str(df) 

щоб перевірити це. Потім зробіть це подвійне змінне змінної, щоб зберегти номери років замість того, щоб перетворюватись на "1,2,3,4" номери рівня:

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

EDIT: виявляється, що у вашому data.frame є змінна класу "масив", яка може викликати pb. Спробуйте потім:

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

і заговорити знову?


3
Це для мене зручна відповідь, оскільки вона виправляє проблему з кореня
Медхат

1
Гарна відповідь за запобігання цього попередження!
Михай

2

У мене була схожа проблема з кадром даних:

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

Я думаю, що змінна для осі x повинна бути числовою, щоб geom_line знав, як з'єднати точки, щоб провести лінію.

після того як я зміню 2-й стовпець на числовий:

 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

тоді це працює.


1

Запустіть R у новому сеансі та вставте це:

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

Запустіть R у новому сеансі та вставте в нього код у своєму дописі.
Г. Гротендієк

Ви зрозуміли цю проблему. У мене з вашою проблемою те, що я маю лише одне значення для кожного значення x. Чекаю вашої відповіді. Дякую.
Hoang Le

0

Я отримав подібний підказки. Це було тому, що я вказав вісь x у певному відсотку (наприклад: 10% A, 20% B, ....). Отже, альтернативним підходом може бути те, що ви помножите ці значення і записуєте їх у найпростішій формі.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.