Контурный график пользовательской функции в R

Я работаю с некоторыми пользовательскими функциями, и мне нужно нарисовать контуры для них на основе нескольких значений параметров.

Вот примерная функция:

enter image description here

Мне нужно нарисовать такой график контура:

enter image description here

Любая идея?

Спасибо.

Ответ 1

Сначала вы создаете функцию fourvar, которая принимает эти четыре параметра в качестве аргументов. В этом случае вы могли бы сделать это с тремя переменными, один из которых был 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() -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, похоже, не имеет достаточного контроля для правильного распространения меток в этом случае. В других примерах, которые я видел, он распространяет метки вокруг области графика. Я полагаю, что я мог бы посмотреть на код, но поскольку он зависит от "прото-пакета", он, вероятно, будет запутанным, поэтому я не смотрел.

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)

Обратите внимание, что это позиции индекса из матрицы, а не отношения параметров, но это должно быть довольно легко исправить.

enter image description here

С другой стороны, насколько легко можно построить его в решетке (и я думаю, что он выглядит "чище":

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

enter image description here

Ответ 2

Поскольку я думаю, что вопрос все еще актуален, произошли некоторые изменения в маркировке контурных metR пакете metR. Добавление к предыдущему примеру даст вам хорошую маркировку контуров также с помощью ggplot2

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

Labeled contour plot