R 使用qplot绘制函数族而不复制数据

R 使用qplot绘制函数族而不复制数据,r,plot,ggplot2,R,Plot,Ggplot2,给定函数族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)),

给定函数族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范围复制每个参数值。有什么替代方法可以在没有这些重复的情况下生成相同的图形?

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

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

> object.size(rnorm(900))
7240 bytes
并且
x
范围内的100个值足以给出平滑的绘图

用于
循环以将层添加到ggplot
require(“ggplot2”)
##一些复制ggplot的调色板的东西,当然有一些东西
##要在**ggplot**中执行此操作,请立即。。。

ggHueColours循环解决方案是我正在寻找的替代方案,谢谢@顶级厨师真的吗?您正在绘制多大尺寸的对象?循环解决方案很糟糕——为什么你想通过强制增加图层和手动控制颜色来复制Hadley在ggplot中添加的糖?我不知道,但你也必须自己生成图例。你能用ggplot添加简单的循环解决方案吗?(无需复制情节细节)我可以添加一个简单的例子——如果它不能生成图例等,那么你必须自己解决这个问题,或者希望其他人插话,或者就这个具体细节问一个后续问题(作为单独的问题)。我理解。在我看到循环解决方案之前,我并不觉得它很糟糕。我的函数示例非常简单。我发现复制数据也很麻烦。我正在寻找循环解决方案,但由于我在ggplot方面的经验非常有限,所以无法实现。但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