Как я должен исправить свой код ggplot boxplot, чтобы получить желаемый внешний вид?

#r #ggplot2 #boxplot

Вопрос:

Я намерен создать диаграмму с функцией коробочной диаграммы для тех данных, которые сгруппированы по годам и по другому фактору (называемому статусом). Мой набор данных находится во фрейме данных imf.cas и состоит из следующих записей:

  country_iso_code year  value  status
              AFG 2019 11.705 Surplus
              AFG 2020 10.712 Surplus
              FRA 2019 -0.667   Mixed
              FRA 2020 -2.337   Mixed
              USA 2019 -2.241 Deficit
              USA 2020 -3.088 Deficit
 

В начале мой код был:

 ggplot(data = imf.cas, aes(x=year, y=value, group=year, fill=status)) 
  geom_boxplot(outlier.shape = 1, outlier.color = "grey")  
  coord_cartesian(ylim = c(-25,25))  
  labs(x = "", y="(% of GDP)")
 

Это привело к следующему виду диаграммы, который, похоже, игнорирует мою команду fill=status :
введите описание изображения здесь

Затем я расширил свой код следующим образом, пытаясь проверить fill=status , работает ли он:

 ggplot(data = imf.cas, aes(x=year, y=value, group=year, fill=status)) 
   geom_boxplot(outlier.shape = 1, outlier.color = "grey")  
   coord_cartesian(ylim = c(-25,25))   
   labs(x = "", y="(% of GDP)")  
   facet_wrap(~status,ncol = 3)  
   theme(axis.title.y = element_text(size = 9),
      legend.title = element_blank(), 
      legend.background=element_blank(),
      legend.position = "bottom", plot.caption = element_text(hjust = 0, size = 8))
 

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

Я изо всех сил пытаюсь понять, почему мой исходный код не отображал данные в столбце «Разбивка по статусу». Любая помощь очень ценится!

P.S. В расширенной версии кода geom_smooth() добавлена команда (ниже). Однако линии сглаживания не видны для каждой из трех частей диаграммы (ниже). Почему?

 ggplot(data = df, aes(x=year, y=value, group = interaction(year, status), fill=status)) 
    geom_boxplot(outlier.shape = 1, outlier.color = "grey")  
    geom_smooth(data = df, aes(x=year, y=value), method = "loess", se=TRUE, color = "orange")  
    coord_cartesian(ylim = c(min(lims$min),max(lims$max)))   
    labs(x = "", y="(% of GDP)")  
    facet_wrap(~status, ncol = 3)  
    theme(axis.title.y = element_text(size = 9),
       legend.title = element_blank(), 
       legend.background=element_blank(),
       legend.position = "bottom", plot.caption = element_text(hjust = 0, size = 8))
 

введите описание изображения здесь

Комментарии:

1. Вам нужно будет сгруппироваться как по году, так и по статусу, чтобы в год было 3 поля, по одному для каждого статуса. Поэтому попробуйте group = interaction(year, status) в первой строке вашего кода ggplot

2. Большое спасибо! Это хорошо работает таким образом.