r - 在 ggplot2 中创建用于绘图的循环会导致错误
问题描述
这已经以类似的风格发布过,但我现在已经调整了一些东西,希望(!)现在一切都清楚了
我试图创建一个循环以便为几个国家创建地块。
我的数据框: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
)
我想要做的是(大多数你会从我下面的代码中看到):
- 创建循环,因此将为所有国家/地区创建图
- x 轴 = 年;y=排放量(国家如
Plot_df$country
) - 3组(曲线)应来自`Plot_df$sector:Regulated, Unregulation, ETS Regulated and unregulations should be between 1990:2016; 2005:2017 之间的 ETS。(这些年是有数据可用的年份)
这是我尝试过的:
# 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?
知道为什么会这样吗?
无论如何谢谢
解决方案
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
)
}
推荐阅读
- mysql - Laravel 5 DB::statement return SQLSTATE[42000]: 语法错误或访问冲突:1064 你的 SQL 语法有错误;查看
- java - 使用 Apache Camel 从 Mongo DB 中删除文档
- javascript - jquery从数组动态创建表
- python - 反应添加错误,如何解决?
- python - 在 Windows 上快速终止所有正在运行的进程
- ios - 自定义数据不适用于 itemProvider 的拖放集合视图功能 - Swift
- javascript - UnhandledPromiseRejectionWarning: TypeError: UserService.authenticate is not a function
- javascript - 我尝试为 createUser 创建一个可调用函数,但运行它时出现错误,我不知道为什么
- google-play - Google 因欺骗性广告政策拒绝了我的应用
- internationalization - 有没有办法在没有 Next.js 国际化路由的情况下使用 next-i18next?