Линейный график 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")
megashigger
источник
Это не дает ошибки, когда я запускаю его. Вероятно, dfэто не то, что вы думаете. Пожалуйста, сформулируйте свой вопрос в воспроизводимой форме, т.е. покажите результат dput(df).
Г. Гротендик,
может быть, что ваши переменные являются факторами, тогда вам нужно преобразовать их в числовые
свекла
@ G.Grothendieck Я написал то, что ты сказал. Я также преобразовал в числовое и все еще есть проблема.
мегасигер
Вы действительно должны сформулировать вопросы в воспроизводимой форме. Вам трудно помочь, если мы не сможем воссоздать ошибку.
Марио Бесерра

Ответы:

344

Вам нужно только добавить 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")
Марио Барбе
источник
Следует отметить, что группирование должно быть сделано с groupаргументом. Группировать только, например, colorбыло бы недостаточно. У меня просто была эта проблема, и я надеюсь, что это поможет кому-то
столкнуться
этот ответ остается в силе? Добавление группы = 1 в эстетику, похоже, больше не работает.
Джакомо
@Giacomo - у меня работает, на 3.6.2 на Mac. Получал страшное предупреждение, но добавление group = 1 решило проблему. ggplot (lakemeta, map = aes (x = Lake, y = Area, group = 1)) + geom_line (size = 2, color = "blue")
Дженн Д.
27

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

str(df) 

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

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

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

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

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

agenis
источник
3
Это для меня удобный ответ, потому что он исправляет проблему от рута
Medhat
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

Я думаю, что переменная для оси х должна быть числовой, чтобы 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. Жду вашего ответа. Спасибо.
Хоанг Ле
0

Я получил похожую подсказку. Это потому, что я указал ось х в процентах (например, 10% A, 20% B, ....). Таким образом, альтернативный подход может заключаться в том, что вы умножаете эти значения и записываете их в простейшей форме.

Areeha
источник