使用ggplot2绘制多条曲线

3
假设我有一个数据框 coefs,其中每一行包含曲线的模型系数。
coefs <- structure(list(a1 = c(1.22228259789383, 1.2064168157394, 1.09555089661994, 0.943947433470916, 0.883490658557721, 0.46125552320107), d = c(0.385227755933488, 0.457271644919152, 0.340063262461958, 0.305629949064525, 0.42459163183877, 0.425710112988664), g = c(0, 0, 0, 0, 0, 0), u = c(1, 1, 1, 1, 1, 1)), .Names = c("a1", "d", "g", "u"), class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA, -6L))

我希望能够使用数据框中的每一行根据定义的函数向绘图添加新的曲线:(您可能会将其识别为2PL项目反应模型)

TWOPL <- function(x,a1,b) {
  1 / (1 + exp(-a1*(x-(b))))
}

基于这个这个问题,我尝试使用下面的ggplot命令,但是出现了计算失败的错误:

library(ggplot2)
p <- ggplot(coefs, aes(x = 0))
p + stat_function(fun = TWOPL) + xlim(-5,5)

我知道我需要一种方法将各种系数提供给函数。作为测试,我尝试使用固定参数来创建1条曲线,并且它可以正常工作,例如:

#1 curve based on fixed parameters
TWOPL_copy <- function(x) {
  1 / (1 + exp(-1.22*(x-(.385))))
}

p <- ggplot(data.frame(x = 0), aes(x = 0))
p + stat_function(fun = TWOPL_copy) + xlim(-5,5)

我想知道如何将数据框的每一行发送到ggplot。下一步的理想情况是以某种方式区分每条线的颜色。


我刚刚遇到了这个问题(http://stackoverflow.com/questions/21686638/plotting-a-data-frame-from-within-a-function-with-ggplot2),一个可能的方法是创建一个临时数据框来推断y值,然后将其传递给ggplot2。 - Andrew Jackson
1个回答

9

虽然你可以为每组参数调用stat_function,或者通过编程方式进行一些繁琐的调用,但是自己计算会更简单:

library(tidyverse)

coefs %>% 
    mutate(curve = letters[row_number()]) %>%    # add curve name
    crossing(x = seq(-5, 5, .1)) %>%    # repeat each row for every occurence of x
    mutate(y = TWOPL(x, a1, d)) %>%    # compute y values
    ggplot(aes(x, y, color = curve)) + 
    geom_line()

使用编程方式创建曲线的最简单方法是在绘图中添加stat_function调用列表。必须迭代所有美学,包括颜色。必须提供一个x美学,但如果设置了xlim,则它的值不重要。

curves <- coefs %>% 
    mutate(curve = letters[row_number()]) %>% 
    pmap(function(...){
             dots <- data_frame(...)
             stat_function(data = dots, aes(0, color = curve), 
                           fun = function(x) TWOPL(x, dots$a1, dots$d), 
                           xlim = c(-5, 5))
    })

ggplot() + curves


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接