Juanchi - 1 year ago 105
R Question

# loop to plot several fitted curves in ggplot?

With this dataset, where I have a factor with 3 levels (iso), and two continuous variables (temp and diam)

``````library(ggplot2)
library(nlme)

zz <-(" iso temp diam
Itiquira   22  5.0
Itiquira   22  4.7
Itiquira   22  5.4
Itiquira   25  5.8
Itiquira   25  5.4
Itiquira   25  5.0
Itiquira   28  4.9
Itiquira   28  5.2
Itiquira   28  5.2
Itiquira   31  4.2
Itiquira   31  4.0
Itiquira   31  4.1
Londrina   22  4.5
Londrina   22  5.0
Londrina   22  4.4
Londrina   25  5.0
Londrina   25  5.5
Londrina   25  5.3
Londrina   28  4.6
Londrina   28  4.3
Londrina   28  4.9
Londrina   31  4.4
Londrina   31  4.1
Londrina   31  4.4
Sinop   22  4.5
Sinop   22  5.2
Sinop   22  4.6
Sinop   25  5.7
Sinop   25  5.9
Sinop   25  5.8
Sinop   28  6.0
Sinop   28  5.5
Sinop   28  5.8
Sinop   31  4.5
Sinop   31  4.6
Sinop   31  4.3"
)
``````

I fit a curve for each factor level and I need to plot them in a same graphic.

Is there a way to do this next plot all the curves at once, avoiding repeating the same function "+ geom_smooth(...)" for each level factor (iso)?

``````daf <- groupedData(diam ~ temp | iso, data = df, order = FALSE)

ip <- ggplot(data=daf,  aes(x=temp, y=diam, colour = iso)) +
geom_point() + facet_wrap(~iso)

ip + geom_smooth(method = "nls",
method.args = list(formula = y ~ thy * exp(thq * (x-thx)^2 + thc * (x - thx)^3),
start = list(thy=5.4, thq=-0.01, thx=25, thc=0.0008)),
se = F, size = 0.5, data = subset(daf, iso=="Itiquira")) +

geom_smooth(method = "nls",
method.args = list(formula = y ~ thy * exp(thq * (x-thx)^2 + thc * (x - thx)^3),
start = list(thy=5.4, thq=-0.01, thx=25, thc=0.0008)),
se = F, size = 0.5, data = subset(daf, iso=="Londrina")) +

geom_smooth(method = "nls",
method.args = list(formula = y ~ thy * exp(thq * (x-thx)^2 + thc * (x - thx)^3),
start = list(thy=5.4, thq=-0.01, thx=25, thc=0.0008)),
se = F, size = 0.5, data = subset(daf, iso=="Sinop"))
``````

You can get the same plot without repeating the same function for each level factor (iso) like this:

``````ggplot(data=daf,  aes(x=temp, y=diam, colour = iso)) +
geom_point() +
facet_wrap(~iso) +
geom_smooth(method="nls",
method.args=list(formula=y ~ thy * exp(thq * (x-thx)^2 + thc * (x - thx)^3),
start=list(thy=5.4, thq=-0.01, thx=25, thc=0.0008)),
se = F,
size = 0.5)
``````

Recommended from our users: Dynamic Network Monitoring from WhatsUp Gold from IPSwitch. Free Download