Линейная диаграмма 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")
Ответы
Ответ 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
тогда это работает.