Создание цикла для построения графиков в ggplot2 приводит к ошибке - PullRequest
0 голосов
/ 10 ноября 2018

это было опубликовано ранее в аналогичном стиле, но сейчас я исправил несколько вещей и, надеюсь, (!) Все стало ясно

Я пытался создать цикл для создания графиков для нескольких стран.

Мой фрейм данных: Plot_df

Вот выдержка из данных:

year country iso2      sector emissions
1990 Belgium   BE         ETS         0
1990 Belgium   BE   Regulated  78614107
1990 Belgium   BE Unregulated  41870292
1991 Belgium   BE         ETS         0
1991 Belgium   BE   Regulated  79811521
1991 Belgium   BE Unregulated  43733190
...
2011 Belgium   BE         ETS  46203056
2011 Belgium   BE   Regulated  61319344
2011 Belgium   BE Unregulated  42839297
2012 Belgium   BE         ETS  43006980
2012 Belgium   BE   Regulated  58934979
2012 Belgium   BE Unregulated  42459997
2013 Belgium   BE         ETS  45231176
2013 Belgium   BE   Regulated  58383554
2013 Belgium   BE Unregulated  43586891
2014 Belgium   BE         ETS  43853144
2014 Belgium   BE   Regulated  56010346
2014 Belgium   BE Unregulated  40380694
2015 Belgium   BE         ETS  44713916
2015 Belgium   BE   Regulated  57375031
2015 Belgium   BE Unregulated  42854461
2016 Belgium   BE         ETS  43655728
2016 Belgium   BE   Regulated  56702848
2016 Belgium   BE Unregulated  43540863

dput(head(Plot_df, 15)) доставляет это

structure(list(year = c("1990", "1990", "1990", "1990", "1990", 
"1990", "1990", "1990", "1990", "1990", "1990", "1990", "1990", 
"1990", "1990"), country = c("Austria", "Austria", "Austria", 
"Belgium", "Belgium", "Belgium", "Bulgaria", "Bulgaria", "Bulgaria", 
"Croatia", "Croatia", "Croatia", "Cyprus", "Cyprus", "Cyprus"
), iso2 = c("AT", "AT", "AT", "BE", "BE", "BE", "BG", "BG", "BG", 
"HR", "HR", "HR", "CY", "CY", "CY"), sector = c("ETS", "Regulated", 
"Unregulated", "ETS", "Regulated", "Unregulated", "ETS", "Regulated", 
"Unregulated", "ETS", "Regulated", "Unregulated", "ETS", "Regulated", 
"Unregulated"), emissions = c(0, 38264402.6689529, 24027827.7997971, 
0, 78614106.9221497, 41870291.5153503, 0, 69103153.6445618,         
9569791.66793823, 
0, 17530229.1374207, 5911735.70632935, 0, 3135556.17528036, 1507499.48878214
)), row.names = c("378", "2836", "3100", "813", "8310", "8410", 
"558", "16410", "16510", "438", "24510", "24610", "783", "3261", 
"3271"), class = "data.frame")

Я только показал полные данные для одной страны, поскольку каждая страна выглядит одинаково (за исключением разных цифр Plot_df$emissions)

То, что я хочу сделать, это (большинство вы увидите из моего кода ниже):

  • создать цикл, поэтому графики будут созданы для всех стран
  • ось х = год; y = выбросы (страны как в Plot_df$country)
  • 3 группы (кривые) должны быть из сектора `Plot_df $: регулируемый, нерегулируемый, ETS Регулируемый и нерегулируемый должен быть между 1990: 2016; ETS между 2005: 2017. (эти годы являются годами доступности данных)

Вот что я пробовал:

# Sets up the loop to run from i=1 through a list of countries from vector 
`Plot_df$country`
for(i in (1:length(unique(Plot_df$country)))){

# Color settings: colorblind-friendly palette
cols <- c("#999999", "#E69F00", "#56B4E9", "#009E73", "#F0E442", "#0072B2", 
        "#D55E00", "#CC79A7")

# Plotting code where DATA, YEAR, etc need to be handed the right vectors
p <- ggplot() +
geom_line(Plot_df,aes(x=year,y=emissions,group=sector),
          color=cols[1]) +
labs(x="Year",y="CO2 emissions",z="",title=paste("Emissions for", 
country[i])) + 
xlim(1990, 2016) +
ylim(-50,50) +
theme(plot.margin=unit(c(.5,.5,.5,.5),"cm"))
p

# Save plot, where the file name automatically gets a country name suffix
 ggsave(p,filename=paste("./FILENAME",country[i],".png",sep=""),width=6.5, 
     height=6)
}

Я получаю эту ошибку и не могу понять, почему

Error: `data` must be a data frame, or other object coercible by 
`fortify()`, not an S3 object with class uneval
Did you accidentally pass `aes()` to the `data` argument?

Есть идеи, почему это происходит?

Спасибо в любом случае

1 Ответ

0 голосов
/ 10 ноября 2018

FWIW немного стилей кода имеет большое значение.

for(country in unique(Plot_df$country)) {

  # YOU NEVER *REALLY* USE THIS VECTOR JUST ONE ELEMENT FROM IT

  # Color settings: colorblind-friendly palette
  c(
    "#999999", "#E69F00", "#56B4E9", "#009E73", 
    "#F0E442", "#0072B2", "#D55E00", "#CC79A7"
  ) -> cols

  # carve out the data for the plot
  country_df <- Plot_df[Plot_df$country == country,]

  # Plotting code where DATA, YEAR, etc need to be handed the right vectors
  ggplot() +
    geom_line(
      data = country_df, # THIS IS WHAT YOU FORGOT
      aes(year, emissions, group = sector), 
      color = cols[1] # WHY [1] IF YOU DEFINED A VECTOR
    ) +
    xlim(1990, 2016) + # SHOULD LIKELY USE scale_x_… and set limits there + expand=c(0,0) insteasd
    ylim(-50, 50) + # SAME
    labs(
      x = "Year", y = "CO2 emissions", 
      title = sprintf("Emissions for %s", country)
    ) + 
    theme(plot.margin = margin(.5, .5, .5, .5, "cm")) -> p # THERE IS A margin() function

  print(p) # it won't print without print()

  # Save plot, where the file name automatically gets a country name suffix
  ggsave(
    plot = p, 
    filename = sprintf("./FILENAME-%s.png", country), # I PREFER sprintf
    width = 6.5, 
    height = 6
  )
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...