geom_smooth不会出现在ggplot上

时间:2016-04-13 20:41:08

标签: r plot ggplot2

我正在进行一些粘度实验,我正在尝试用ν对θ进行Eyring绘图。 当我使用ggplot2创建绘图时,我无法显示我的模型。

这些是使用的值:

> theta
[1] 25 30 35 40 45
> nu
[1] 1.448462 1.362730 1.255161 1.167408 1.083005

在这里,我使用上面的值创建绘图:

plot <-
  ggplot()+
  geom_point(mapping = aes(theta, nu), colour = "#0072bd", size = 4, shape = 16)+
  theme_bw()+
  labs(
    x = expression(paste(theta,  " ", "[°C]")), 
    y = expression(paste("ln(", nu, ")", " ", "[mPa*s]")))+
  ylim(0, 10)+
  xlim(0, 100)

That's what the plot looks like.

现在,我使用geom_smooth()

添加我的模型
plot +
  geom_smooth(
    method = "nls", 
    method.args = list(formula = nu~a*exp(b/theta), 
                       start=list(a=1, b=0.1)))

但没有任何反应......甚至没有错误信息,情节看起来和以前一样。

我还尝试将formula直接作为geom_smooth()参数和起始值,

plot +
  geom_smooth(
    method = "nls",
    formula = nu~a*exp(b/theta),
    start=list(a=1, b=0.1))

然后我得到了

  

错误:未知参数:启动

有人能找到我犯的错误吗?

提前致谢!

干杯

修改

分离美学映射时,

plot <-
  ggplot()+
  aes(theta, nu)+
  geom_point(colour = "#0072bd", size = 4, shape = 16)+
  theme_bw()+
  labs(
    x = expression(paste(theta,  " ", "[°C]")), 
    y = expression(paste("ln(", nu, ")", " ", "[mPa*s]")))+
  ylim(0, 10)+
  xlim(0, 100)

我收到以下错误(仍然没有任何变化):

警告讯息:

  

1:在min(x)中:min没有非缺失参数;返回Inf   2:在max(x)中:min没有非缺失参数;返回-Inf   3:stat_smooth()中的计算失败:   $运算符对原子向量无效

2 个答案:

答案 0 :(得分:5)

你有几件事情正在发生,其中很多都在评论中指出。

将变量放在ggplot的data.frame中,并在ggplotgeom内全局定义美学,最重要的是在geom_smooth希望您引用yx而不是变量名称。 geom_smooth将使用您在y中映射到xaes的变量。

您将遇到的另一个复杂因素是here。由于您没有从predict.nls获得标准错误,因此您需要在se = FALSE中使用geom_smooth

以下是geom_smooth代码的外观:

geom_smooth(method = "nls", se = FALSE, 
              method.args = list(formula = y~a*exp(b/x), start=list(a=1, b=0.1)))

这是完整的代码和情节。

ggplot(df, aes(theta, nu))+
    geom_point(colour = "#0072bd", size = 4, shape = 16)+
    geom_smooth(method = "nls", se = FALSE,
              method.args = list(formula = y~a*exp(b/x), start=list(a=1, b=0.1))) +
    theme_bw()+
    labs(
        x = expression(paste(theta,  " ", "[°C]")), 
        y = expression(paste("ln(", nu, ")", " ", "[mPa*s]")))+
    ylim(0, 10) +
    xlim(0, 100)

enter image description here 请注意,geom_smooth不符合数据集范围,除非您使用fullrange = TRUE而不是默认值。如果您只有5个数据点,这可能会非常值得怀疑。

ggplot(df, aes(theta, nu))+
    geom_point(colour = "#0072bd", size = 4, shape = 16)+
    geom_smooth(method = "nls", se = FALSE, fullrange = TRUE,
              method.args = list(formula = y~a*exp(b/x), start=list(a=1, b=0.1))) +
    theme_bw()+
    labs(
        x = expression(paste(theta,  " ", "[°C]")), 
        y = expression(paste("ln(", nu, ")", " ", "[mPa*s]")))+
    ylim(0, 10) +
    xlim(0, 100)

enter image description here

答案 1 :(得分:2)

我刚写了这个答案,因为@lukeA做了评论。

df<- data.frame(theta = c(25, 30, 35, 40, 45),
                nu = c( 1.448462, 1.362730, 1.255161, 1.167408, 1.083005))

myModel <- nls(nu~a*exp(b/theta), data=df, start=list(a=1, b=0.1))

myPredict <- expand.grid(theta = seq(5, 100, by =0.1))  
  #expand.grid here in case your model has more than one variable
  #Caution, extrapolating well beyond the data
myPredict$fit <- predict(myModel, newdata= myPredict) 


plot + geom_line(data = myPredict, aes(x= theta, y= fit))

enter image description here