Подтвердить что ты не робот

Линейная диаграмма ggplot2 дает "geom_path: каждая группа состоит только из одного наблюдения. Нужно ли настраивать групповую эстетику?"

С этим фреймом данных ( "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")
4b9b3361

Ответ 1

Вам нужно только добавить group = 1 в ggplot или geom_line aes().

Для линейных графиков точки данных должны быть сгруппированы так, чтобы они знали, какие точки соединить. В этом случае все просто - все точки должны быть связаны, поэтому group = 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")

Ответ 2

Вы получаете эту ошибку, потому что одна из ваших переменных является факторной переменной. казнить

str(df) 

чтобы проверить это. Затем выполните двойное изменение переменной, чтобы сохранить числа года вместо преобразования в числа уровня "1,2,3,4":

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

РЕДАКТИРОВАТЬ: кажется, что ваш data.frame имеет переменную класса "массив", который может вызвать pb. Попробуйте тогда:

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

и снова заговор?

Ответ 3

Запустите 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")

Ответ 4

У меня была похожая проблема с фреймом данных:

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

тогда это работает.