10

我正在使用一些自定义函数,我需要根据参数的多个值为它们绘制轮廓。

这是一个示例函数:

在此处输入图像描述

我需要绘制这样一个等高线图:

在此处输入图像描述

任何想法?

谢谢。

4

2 回答 2

17

首先你构造一个函数,fourvar它将这四个参数作为参数。在这种情况下,您可以使用 3 个变量来完成,其中一个是 lambda_2 而不是 lambda_1。Alpha1 固定为 2,因此 alpha_1/alpha_2 将在 0-10 范围内变化。

fourvar <- function(a1,a2,l1,l2){ 
  a1* integrate( function(x) {(1-x)^(a1-1)*(1-x^(l2/l1) )^a2} , 0 , 1)$value }

诀窍是要意识到该integrate函数返回一个列表,而您只需要该列表的“值”部分,因此可以对其进行Vectorize()编辑。

其次,您使用该函数构造一个矩阵:

  mat <- outer( seq(.01, 10, length=100),  
                seq(.01, 10, length=100), 
                Vectorize( function(x,y) fourvar(a1=2, x/2, l1=2, l2=y/2) ) )

然后,在这些位置创建带有标签的绘图的任务只能使用lattice::contourplot. 在进行了合理的搜索之后,geom_contour 标签的解决方案似乎仍在 ggplot2 中进行。我发现的唯一标签策略是在外部包装中。但是,在这种情况下,'directlabels' 包的功能directlabel似乎没有足够的控制来正确展开标签。在我看到的其他示例中,它确实将标签散布在绘图区域周围。我想我可以看一下代码,但由于它依赖于“proto”包,它可能会被奇怪地封装,所以我没有看。

require(reshape2)
mmat <- melt(mat)
str(mmat) # to see the names in the melted matrix
g <- ggplot(mmat, aes(x=Var1, y=Var2, z=value) )
g <- g+stat_contour(aes(col = ..level..), breaks=seq(.1, .9, .1) )
g <- g + scale_colour_continuous(low = "#000000", high = "#000000") # make black
install.packages("directlabels", repos="http://r-forge.r-project.org", type="source")
require(directlabels)
direct.label(g)

请注意,这些是矩阵中的索引位置,而不是参数的比率,但这应该很容易修复。

在此处输入图像描述

另一方面,这是在格子中构建它的容易程度(我认为它看起来“更干净”:

  require(lattice)
  contourplot(mat, at=seq(.1,.9,.1))

在此处输入图像描述

于 2013-09-29T17:50:48.280 回答
2

metR由于我认为这个问题仍然相关,包装中的等高线图标签已经有了一些发展。添加到前面的例子中会给你很好的轮廓标签ggplot2

require(metR)
g + geom_text_contour(rotate = TRUE, nudge_x = 3, nudge_y = 5)

标记的等高线图

于 2019-07-12T09:21:53.783 回答