我想使用ggplot2
来显示功率曲线之后的一些数据。之前已经问过这个问题(Add exp/power trend line to a ggplot),但答案并没有真正帮助。
一个技巧是使用stat_function()
创建一条曲线。但是,我无法获得stat_function()
和我的功率曲线以对数刻度。
我说明了我的问题。
创建一些样本数据和基础图:
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)
很好,让我们使用coord_trans()
添加一些logaritmic比例。这完全有效,除了我的直线不再笔直(正如文档告诉我所期望的那样)。
p + stat_function(fun = pwr) + coord_trans(x = "log10", y = "log10")
所以,请使用coord_x_log10()
和coord_y_log10()
再试一次,但会引发错误:
p + stat_function(fun = pwr) + scale_x_log10() + scale_y_log10()
Error in seq.default(min, max, by = by) :
'from' cannot be NA, NaN or infinite
这很可能与我必须调整我的功能以反转音阶效果的事实有关,但我无法弄明白。
我只能使用logarithmix x-scale:
p + scale_x_log10() + stat_function(fun = function(x)pwr(10^x))
如果我添加scale_y_log10()
,我不知道如何转换y值。
我可能遗漏了一些基本的东西。有没有简单的方法来绘制这条曲线?
答案 0 :(得分:6)
将我的评论写入答案:
主要问题是stat_function
中的错误。当与轴变换结合使用时,它会根据变换而不是原始值计算y值。最近这是fixed on github。
然而,这不容易看到,因为在计算轴断裂时发生第一个错误,因为错误产生Inf
,零和/或负y值。您需要设置显式轴限制,以查看实际问题是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).
如果你只改变x轴,那就更明显了:
p + stat_function(fun = pwr) +
scale_x_log10()
如果你不能使用github的ggplot2版本,你可以使用它:
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()