[英]contour plot of a custom function in R
我正在使用一些自定义函数,我需要根据参数的多个值为它们绘制轮廓。
这是一个示例函数:
我需要绘制这样的等高线图:
任何的想法?
谢谢。
首先构造一个函数, fourvar
将这四个参数作为参数。 在这种情况下,您可以使用3个变量完成它,其中一个变量是lambda_1上的lambda_2。 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
函数返回一个列表,你只需要该列表的'value'部分,因此它可以是Vectorize()
ed。
其次,使用该函数构造矩阵:
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))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.