r - How to draw a power curve using ggplot2 -
i want use ggplot2 visualize data follows power curve. has been asked before (add exp/power trend line ggplot) answer didn't help.
one trick use stat_function() create curve. however, unable  stat_function() , power curve work logarithmic scales.
i illustrate problems.
create sample data , base plot:
library(ggplot2)  x <- 1:100 pwr <- function(x)x^-2.5 dat <- data.frame(x, y = pwr(x))  p <- ggplot(dat, aes(x = x, y = y)) +    geom_point()  p + stat_function(fun = pwr)     great, let's add logaritmic scales using coord_trans().  works perfectly, except straight lines no longer straight (exactly documentation tells me expect).
p + stat_function(fun = pwr) + coord_trans(x = "log10", y = "log10")     so, try again coord_x_log10() , coord_y_log10(), throws error:
p + stat_function(fun = pwr) + scale_x_log10() + scale_y_log10()  error in seq.default(min, max, = by) :    'from' cannot na, nan or infinite   this has fact have adjust function invert effect of scales, can't quite figure out.
i can logarithmix x-scale:
p + scale_x_log10() + stat_function(fun = function(x)pwr(10^x))     i have no idea how convert y-values if add scale_y_log10().
i'm missing fundamental. there easy way plot curve?
putting comments answer:
the main problem bug in stat_function. when used in conjunction axis transformations calculates y-values transformed , not original values. has been fixed on github recently. 
however, not easy see since first error occurs when calculating axis breaks since bug produces inf, 0 and/or negative y-values. need set explicit axis limits see actual problem stat_function:
p + stat_function(fun = pwr) +    scale_x_log10() + scale_y_log10(limits = c(1e-5, 1)) #warning message: #removed 100 rows containing missing values (geom_path).     it's more obvious if transform x-axis:
p + stat_function(fun = pwr) +    scale_x_log10()      if can't use ggplot2 version github use this:
p + geom_line(data = data.frame(x = seq(min(dat$x), max(dat$x), length.out = 100)),               aes(y = pwr(x))) +    scale_x_log10() + scale_y_log10()        





Comments
Post a Comment