【问题标题】:geom_smooth with facet_grid and different fitting functions具有 facet_grid 和不同拟合功能的 geom_smooth
【发布时间】:2017-12-08 07:28:57
【问题描述】:

首先,为这个例子道歉,但我找不到更好的数据集来证明这个问题。希望,这就足够了。假设我正在尝试从绘制 mpg 与位移的 mtcars 数据集中创建一个分面网格(自动与手动)和齿轮数量,如下所示:

# Load library
library(ggplot2)

# Load data
data(mtcars)

# Plot data
p <- ggplot(mtcars,aes(x = disp, y = mpg)) + geom_point() + facet_grid(gear ~ am)
p <- p + geom_smooth()
print(p)

给出,

注意,我使用geom_smooth 添加了一条趋势线,它默认使用黄土曲线。我可以使用nls 来拟合用户定义的函数而不是黄土曲线,然后说明一个公式,这很棒。但是是否可以为每个方面拟合不同用户指定的曲线?例如,左上面板的线性回归和右下面板的衰减指数。这可能吗?还是我用锤子敲螺丝?

编辑here 给出了自定义(即用户定义)拟合函数的解决方案。

【问题讨论】:

    标签: r ggplot2 facet-grid


    【解决方案1】:

    按照here 给出的建议,一个可能的解决方案是:

    # Load library
    library(ggplot2)
    
    # Load data
    data(mtcars)
    
    # Vector of smoothing methods for each plot panel
    meths <- c("loess","lm","lm","lm","lm","lm","lm")
    
    # Smoothing function with different behaviour in the different plot panels
    mysmooth <- function(formula,data,...){
       meth <- eval(parse(text=meths[unique(data$PANEL)]))
       x <- match.call()
       x[[1]] <- meth
       eval.parent(x)
    }
    
    # Plot data
    p <- ggplot(mtcars,aes(x = disp, y = mpg)) + geom_point() + facet_grid(gear ~ am)
    p <- p + geom_smooth(method="mysmooth")
    print(p)
    

    【讨论】:

    • 感谢@Marco 的回复。非常感谢。我注意到在meths 中,您只使用先前定义的方法。这也可以使用用户定义的方法吗?请您解释一下mysmooth 的工作原理吗?我猜data$PANEL 是构面编号还是ID?看起来您正在创建一个要在第一行(即方法)执行的命令,并且大概是在最后一行执行的,但是其他两行是如何工作的呢?
    • 好的,我想我快到了。 match.call() 获取传递给mysmooth 函数的所有参数,然后将第一个参数(即formula)替换为我们自己的公式,对吗?接下来,使用这个新公式执行命令。对吗?
    • 您如何为每个方面使用不同的公式?比如x~y和x~log(y)?
    猜你喜欢
    • 2016-09-16
    • 2017-07-29
    • 2018-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-17
    相关资源
    最近更新 更多