Creating loop for plotting in ggplot2 leads to error
up vote
-1
down vote
favorite
this has been posted before in a similar style, but I have adjusted a few things now and hopefully (!) things are clear now
I've tried to create a loop in order to create plots for several countries.
My dataframe: Plot_df
Here an excerpt of the data:
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))
delivers this
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")
I have only shown the whole data for one country, since every country looks the same (apart from different figures Plot_df$emissions
)
What I want to do is (most you will see from my code below):
- create loop, so plots will be created for all countries
- x axis = year; y=emissions (of a country as in
Plot_df$country
) - 3 groups (curves) should be from `Plot_df$sector: Regulated, Unregulated, ETS
Regulated and unregulated should be between 1990:2016; ETS between 2005:2017.
(these years are the years with data availability)
This is what I tried:
# 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)
}
I'm getting this error and I can't figure out why
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?
Any idea why this is happening?
Thanks in any case
r loops ggplot2
add a comment |
up vote
-1
down vote
favorite
this has been posted before in a similar style, but I have adjusted a few things now and hopefully (!) things are clear now
I've tried to create a loop in order to create plots for several countries.
My dataframe: Plot_df
Here an excerpt of the data:
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))
delivers this
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")
I have only shown the whole data for one country, since every country looks the same (apart from different figures Plot_df$emissions
)
What I want to do is (most you will see from my code below):
- create loop, so plots will be created for all countries
- x axis = year; y=emissions (of a country as in
Plot_df$country
) - 3 groups (curves) should be from `Plot_df$sector: Regulated, Unregulated, ETS
Regulated and unregulated should be between 1990:2016; ETS between 2005:2017.
(these years are the years with data availability)
This is what I tried:
# 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)
}
I'm getting this error and I can't figure out why
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?
Any idea why this is happening?
Thanks in any case
r loops ggplot2
geom_line(data=Plot_df
– hrbrmstr
Nov 10 at 14:10
@Nordsee, I've answered this in the other topic.
– arg0naut
Nov 10 at 14:38
1
@arg0naut SO is a code sweat shop, after all (:
– Roman
Nov 10 at 20:52
@hrbrmstr Now I'm getting a different error ->Error: Discrete value supplied to continuous scale
– Nordsee
2 days ago
The issue was thatPlot_df$year
was not set as numeric! Thank you for your help
– Nordsee
11 hours ago
add a comment |
up vote
-1
down vote
favorite
up vote
-1
down vote
favorite
this has been posted before in a similar style, but I have adjusted a few things now and hopefully (!) things are clear now
I've tried to create a loop in order to create plots for several countries.
My dataframe: Plot_df
Here an excerpt of the data:
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))
delivers this
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")
I have only shown the whole data for one country, since every country looks the same (apart from different figures Plot_df$emissions
)
What I want to do is (most you will see from my code below):
- create loop, so plots will be created for all countries
- x axis = year; y=emissions (of a country as in
Plot_df$country
) - 3 groups (curves) should be from `Plot_df$sector: Regulated, Unregulated, ETS
Regulated and unregulated should be between 1990:2016; ETS between 2005:2017.
(these years are the years with data availability)
This is what I tried:
# 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)
}
I'm getting this error and I can't figure out why
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?
Any idea why this is happening?
Thanks in any case
r loops ggplot2
this has been posted before in a similar style, but I have adjusted a few things now and hopefully (!) things are clear now
I've tried to create a loop in order to create plots for several countries.
My dataframe: Plot_df
Here an excerpt of the data:
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))
delivers this
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")
I have only shown the whole data for one country, since every country looks the same (apart from different figures Plot_df$emissions
)
What I want to do is (most you will see from my code below):
- create loop, so plots will be created for all countries
- x axis = year; y=emissions (of a country as in
Plot_df$country
) - 3 groups (curves) should be from `Plot_df$sector: Regulated, Unregulated, ETS
Regulated and unregulated should be between 1990:2016; ETS between 2005:2017.
(these years are the years with data availability)
This is what I tried:
# 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)
}
I'm getting this error and I can't figure out why
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?
Any idea why this is happening?
Thanks in any case
r loops ggplot2
r loops ggplot2
edited 2 days ago
asked Nov 10 at 13:57
Nordsee
265
265
geom_line(data=Plot_df
– hrbrmstr
Nov 10 at 14:10
@Nordsee, I've answered this in the other topic.
– arg0naut
Nov 10 at 14:38
1
@arg0naut SO is a code sweat shop, after all (:
– Roman
Nov 10 at 20:52
@hrbrmstr Now I'm getting a different error ->Error: Discrete value supplied to continuous scale
– Nordsee
2 days ago
The issue was thatPlot_df$year
was not set as numeric! Thank you for your help
– Nordsee
11 hours ago
add a comment |
geom_line(data=Plot_df
– hrbrmstr
Nov 10 at 14:10
@Nordsee, I've answered this in the other topic.
– arg0naut
Nov 10 at 14:38
1
@arg0naut SO is a code sweat shop, after all (:
– Roman
Nov 10 at 20:52
@hrbrmstr Now I'm getting a different error ->Error: Discrete value supplied to continuous scale
– Nordsee
2 days ago
The issue was thatPlot_df$year
was not set as numeric! Thank you for your help
– Nordsee
11 hours ago
geom_line(data=Plot_df
– hrbrmstr
Nov 10 at 14:10
geom_line(data=Plot_df
– hrbrmstr
Nov 10 at 14:10
@Nordsee, I've answered this in the other topic.
– arg0naut
Nov 10 at 14:38
@Nordsee, I've answered this in the other topic.
– arg0naut
Nov 10 at 14:38
1
1
@arg0naut SO is a code sweat shop, after all (:
– Roman
Nov 10 at 20:52
@arg0naut SO is a code sweat shop, after all (:
– Roman
Nov 10 at 20:52
@hrbrmstr Now I'm getting a different error ->
Error: Discrete value supplied to continuous scale
– Nordsee
2 days ago
@hrbrmstr Now I'm getting a different error ->
Error: Discrete value supplied to continuous scale
– Nordsee
2 days ago
The issue was that
Plot_df$year
was not set as numeric! Thank you for your help– Nordsee
11 hours ago
The issue was that
Plot_df$year
was not set as numeric! Thank you for your help– Nordsee
11 hours ago
add a comment |
1 Answer
1
active
oldest
votes
up vote
1
down vote
FWIW a teensy bit of code styling goes a long way.
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
)
}
Thank you for this, but same hereError: Discrete value supplied to continuous scale
– Nordsee
2 days ago
It seems to be something about the color scales, but I'm not entirely clear on it yet
– Nordsee
2 days ago
str(Plot_df)
returns number forPlot_df$emissions
– Nordsee
2 days ago
Having actual data would be helpful (dput()
) is your bff.
– hrbrmstr
2 days ago
I have added 15 entries from dput, I hope this is enough
– Nordsee
2 days ago
|
show 2 more comments
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
up vote
1
down vote
FWIW a teensy bit of code styling goes a long way.
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
)
}
Thank you for this, but same hereError: Discrete value supplied to continuous scale
– Nordsee
2 days ago
It seems to be something about the color scales, but I'm not entirely clear on it yet
– Nordsee
2 days ago
str(Plot_df)
returns number forPlot_df$emissions
– Nordsee
2 days ago
Having actual data would be helpful (dput()
) is your bff.
– hrbrmstr
2 days ago
I have added 15 entries from dput, I hope this is enough
– Nordsee
2 days ago
|
show 2 more comments
up vote
1
down vote
FWIW a teensy bit of code styling goes a long way.
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
)
}
Thank you for this, but same hereError: Discrete value supplied to continuous scale
– Nordsee
2 days ago
It seems to be something about the color scales, but I'm not entirely clear on it yet
– Nordsee
2 days ago
str(Plot_df)
returns number forPlot_df$emissions
– Nordsee
2 days ago
Having actual data would be helpful (dput()
) is your bff.
– hrbrmstr
2 days ago
I have added 15 entries from dput, I hope this is enough
– Nordsee
2 days ago
|
show 2 more comments
up vote
1
down vote
up vote
1
down vote
FWIW a teensy bit of code styling goes a long way.
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
)
}
FWIW a teensy bit of code styling goes a long way.
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
)
}
answered Nov 10 at 14:23
hrbrmstr
57.6k584143
57.6k584143
Thank you for this, but same hereError: Discrete value supplied to continuous scale
– Nordsee
2 days ago
It seems to be something about the color scales, but I'm not entirely clear on it yet
– Nordsee
2 days ago
str(Plot_df)
returns number forPlot_df$emissions
– Nordsee
2 days ago
Having actual data would be helpful (dput()
) is your bff.
– hrbrmstr
2 days ago
I have added 15 entries from dput, I hope this is enough
– Nordsee
2 days ago
|
show 2 more comments
Thank you for this, but same hereError: Discrete value supplied to continuous scale
– Nordsee
2 days ago
It seems to be something about the color scales, but I'm not entirely clear on it yet
– Nordsee
2 days ago
str(Plot_df)
returns number forPlot_df$emissions
– Nordsee
2 days ago
Having actual data would be helpful (dput()
) is your bff.
– hrbrmstr
2 days ago
I have added 15 entries from dput, I hope this is enough
– Nordsee
2 days ago
Thank you for this, but same here
Error: Discrete value supplied to continuous scale
– Nordsee
2 days ago
Thank you for this, but same here
Error: Discrete value supplied to continuous scale
– Nordsee
2 days ago
It seems to be something about the color scales, but I'm not entirely clear on it yet
– Nordsee
2 days ago
It seems to be something about the color scales, but I'm not entirely clear on it yet
– Nordsee
2 days ago
str(Plot_df)
returns number for Plot_df$emissions
– Nordsee
2 days ago
str(Plot_df)
returns number for Plot_df$emissions
– Nordsee
2 days ago
Having actual data would be helpful (
dput()
) is your bff.– hrbrmstr
2 days ago
Having actual data would be helpful (
dput()
) is your bff.– hrbrmstr
2 days ago
I have added 15 entries from dput, I hope this is enough
– Nordsee
2 days ago
I have added 15 entries from dput, I hope this is enough
– Nordsee
2 days ago
|
show 2 more comments
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53239683%2fcreating-loop-for-plotting-in-ggplot2-leads-to-error%23new-answer', 'question_page');
}
);
Post as a guest
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
geom_line(data=Plot_df
– hrbrmstr
Nov 10 at 14:10
@Nordsee, I've answered this in the other topic.
– arg0naut
Nov 10 at 14:38
1
@arg0naut SO is a code sweat shop, after all (:
– Roman
Nov 10 at 20:52
@hrbrmstr Now I'm getting a different error ->
Error: Discrete value supplied to continuous scale
– Nordsee
2 days ago
The issue was that
Plot_df$year
was not set as numeric! Thank you for your help– Nordsee
11 hours ago