Как использовать ggplot для визуализации сгруппированных данных

У меня есть следующий код, который генерирует следующие результаты:

years <- seq(1930, 2020, by = 10)
length(years)
years
labels <- paste(1 + years[-length(years)], years[-1], sep = "-")
length(labels)
labels
SP500 %>% mutate(decade = cut(SP500$Year,seq(1930,2020,by=10), labels = labels)) %>% 
  group_by(decade) %>% summarise(return = mean(`Annual\n% Change`))
# A tibble: 10 × 2
   decade    return
   <fct>      <dbl>
 1 1931-1940  0.014
 2 1941-1950  0.077
 3 1951-1960  0.124
 4 1961-1970  0.056
 5 1971-1980  0.058
 6 1981-1990  0.098
 7 1991-2000  0.157
 8 2001-2010  0.018
 9 2011-2020  0.121
10 NA         0.04 

и мой вопрос: как я могу поместить этот результат в гистограмму или линейную диаграмму? Я пытался сделать это в течение последних нескольких часов, но я продолжаю получать ошибки, хотя я чувствую, что ответ прост, кажется, что я просто не вижу его.

years <- seq(1930, 2020, by = 10)
length(years)
labels <- paste(1 + years[-length(years)], years[-1], sep = "-")
length(labels)
SP500 %>% mutate(decade = cut(SP500$Year,seq(1930,2020,by=10), labels = labels)) %>% 
  group_by(decade) %>% summarise(return = mean(`Annual\n% Change`)) %>%
  ggplot(SP500, aes(x = decade, y = return)) +
  geom_col()

Ошибка в ggplot(): ! Отображение должно быть создано с помощью aes() или aes_().

SP500 %>% ggplot(
  ss <- SP500 %>% mutate(decade = cut(SP500$Year,seq(1930,2020,by=10))) %>% 
  group_by(decade) %>% summarise(return = mean(`Annual\n% Change`)), aes_(x=ss[,1], y= ss[,2]))  + geom_line()

Спасибо заранее

В вашем первом ggplot коде вы передаете данные в ggplot, поэтому вы должны оставить первый аргумент в ggplot пустым (то есть аргумент data). Попробуйте SP500 %>% mutate(decade = cut(SP500$Year,seq(1930,2020,by=10), labels = labels)) %>% group_by(decade) %>% summarise(return = mean(`Annual\n% Change`)) %>% ggplot(aes(x = decade, y = return)) + geom_col()

benson23 10.04.2022 10:09
7 лайфхаков для начинающих Python-программистов
7 лайфхаков для начинающих Python-программистов
В этой статье мы расскажем о хитростях и советах по Python, которые должны быть известны разработчику Python.
0
1
35
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

Помните, что делая

data_frame %>% ggplot(aes(x, y))

Это то же самое, что делать

ggplot(data = data_frame, mapping = aes(x, y))

Но делать

data_frame %>% ggplot(data_frame, aes(x, y))

Это то же самое, что делать

ggplot(data = data_frame, mapping = data_frame, aes(x, y))

И, конечно же, вы получаете ошибку, потому что не можете передать фрейм данных в аргумент mapping.

Так что вы можете сделать

SP500 %>% 
  mutate(decade = cut(SP500$Year,seq(1930,2020,by=10), labels = labels)) %>% 
  group_by(decade) %>% 
  summarise(return = mean(`Annual\n% Change`)) %>%
  ggplot(aes(x = decade, y = return)) +
  geom_col()

или

SP500 <- SP500 %>% 
  mutate(decade = cut(SP500$Year,seq(1930,2020,by=10), labels = labels)) %>% 
  group_by(decade) %>% 
  summarise(return = mean(`Annual\n% Change`))

ggplot(SP500, aes(x = decade, y = return)) +
  geom_col()

Оба из них приводят к:

enter image description here

Приведенный выше график был сделан со следующим кодом, который включает данные, взятые из вашего вопроса. Если вы скопируете и вставите этот блок кода в консоль R, он создаст тот же график:

SP500 <- structure(list(decade = structure(1:9, .Label = c("1931-1940", 
"1941-1950", "1951-1960", "1961-1970", "1971-1980", "1981-1990", 
"1991-2000", "2001-2010", "2011-2020"), class = "factor"), return = c(0.014, 
0.077, 0.124, 0.056, 0.058, 0.098, 0.157, 0.018, 0.121)), row.names = c(NA, 
-9L), class = c("tbl_df", "tbl", "data.frame"))

library(ggplot2)
ggplot(SP500, aes(decade, return)) + geom_col()

большое спасибо, это именно то, что я хотел. И большое спасибо за объяснение, теперь я лучше понимаю

Adam 10.04.2022 10:52

Другие вопросы по теме