如何使用ggplot2

时间:2015-07-23 17:21:46

标签: r ggplot2

我想使用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)

enter image description here

很好,让我们使用coord_trans()添加一些logaritmic比例。这完全有效,除了我的直线不再笔直(正如文档告诉我所期望的那样)。

p + stat_function(fun = pwr) + coord_trans(x = "log10", y = "log10")

enter image description here

所以,请使用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))

enter image description here

如果我添加scale_y_log10(),我不知道如何转换y值。

我可能遗漏了一些基本的东西。有没有简单的方法来绘制这条曲线?

1 个答案:

答案 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).

resulting plot

如果你只改变x轴,那就更明显了:

p + stat_function(fun = pwr) + 
  scale_x_log10() 

resulting plot

如果你不能使用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()

resulting plot