2

给定函数族f(x;q)x是参数,q是参数)我想在x上可视化这个函数族,从区间[0,1]获取 9 个q值(从 0.1 到 0.9) . 到目前为止,我的解决方案是:

f = function(p,q=0.9) {1-(1-(p*q)^3)^1024}
x = seq(0.0,0.99,by=0.01)
q = seq(0.1,0.9,by=0.1)

qplot(rep(x,9), f(rep(x,9),rep(q,each=100)), colour=factor(rep(q,each=100)), 
      geom="line", size=I(0.9), xlab="x", ylab=expression("y=f(x)"))

使用qplot我可以快速轻松地查看:

在此处输入图像描述

我担心的是这种方法相当消耗内存,因为我需要为每个参数复制 x 并为整个 x 范围复制每个参数值。在没有这些重复的情况下生成相同图表的替代方法是什么?

4

1 回答 1

1

在某些时候ggplot需要有可用的数据来绘制它,并且包的工作方式禁止简单地做你想做的事。如果您知道 x 和 y 轴限制,我想您可以设置一个空白图,然后遍历 的 9 个值q,为其生成数据,并向现有的绘图对象q添加一个图层。geom_line但是,您必须自己为每一层生成颜色。

如果这代表您遇到的问题的大小,我不会太担心内存占用。我们只讨论长度为 900 的两个向量

> object.size(rnorm(900))
7240 bytes

范围内的 100 个值x似乎足以给出平滑图。

for循环将图层添加到ggplot

require("ggplot2")

## something to replicate ggplot's colour palette, sure there is something
## to do this already in **ggplot** now...
ggHueColours <- function(n, h = c(0, 360) + 15, l = 65, c = 100,
                         direction = 1, h.start = 0) {
    turn <- function(x, h.start, direction) {
        (x + h.start) %% 360 * direction
    }

    if ((diff(h) %% 360) < 1) {
      h[2] <- h[2] - 360 / n
    }

    hcl(h = turn(seq(h[1], h[2], length = n), h.start = h.start,
        direction = direction), c = c, l =  l)
}

f = function(p,q=0.9) {1-(1-(p*q)^3)^1024}
x = seq(0.0,0.99,by=0.01)
q = seq(0.1,0.9,by=0.1)
cols <- ggHueColours(n = length(q))

for(i in seq_along(q)) {
  df <- data.frame(y = f(x, q[i]), x = x)
  if(i == 1) {
    plt <- ggplot(df, aes(x = x, y = y)) + geom_line(colour = cols[i])
  } else {
    plt <- plt + geom_line(data = df, colour = cols[i])
  }
}

plt

这使:

在此处输入图像描述

我会把剩下的留给你——我对ggplot不够熟悉,无法手动绘制图例。

于 2013-03-31T14:07:13.017 回答