我想用来ggplot2可视化一些功率曲线之后的数据.之前已经问过这个问题(将exp/power trend line添加到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)
Run Code Online (Sandbox Code Playgroud)
太棒了,让我们用一个增加一些logaritmic scale coord_trans().除了我的直线不再笔直(正如文档告诉我期望的那样)之外,这种方式非常有效.
p + stat_function(fun = pwr) + coord_trans(x = "log10", y = "log10")
Run Code Online (Sandbox Code Playgroud)
所以,再次尝试使用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
Run Code Online (Sandbox Code Playgroud)
这很可能与我必须调整我的功能以反转音阶效果的事实有关,但我无法弄明白.
我只能用logarithmix x-scale来做到这一点:
p + scale_x_log10() + stat_function(fun = function(x)pwr(10^x))
Run Code Online (Sandbox Code Playgroud)
如果我添加,我不知道如何转换y值scale_y_log10().
我可能错过了一些基本的东西.有没有一种简单的方法来绘制这条曲线?
把我的评论写成答案:
主要问题是一个错误stat_function.当与轴变换结合使用时,它会根据变换而不是原始值计算y值.最近在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).
Run Code Online (Sandbox Code Playgroud)
如果你只改变x轴,那就更明显了:
p + stat_function(fun = pwr) +
scale_x_log10()
Run Code Online (Sandbox Code Playgroud)
如果您不能使用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()
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1713 次 |
| 最近记录: |