Я работаю с некоторыми пользовательскими функциями, и мне нужно нарисовать контуры для них на основе нескольких значений параметров.
Вот примерная функция:
Мне нужно нарисовать такой график контура:
Любая идея?
Спасибо.
Я работаю с некоторыми пользовательскими функциями, и мне нужно нарисовать контуры для них на основе нескольких значений параметров.
Вот примерная функция:
Мне нужно нарисовать такой график контура:
Любая идея?
Спасибо.
Сначала вы создаете функцию 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)
Обратите внимание, что это позиции индекса из матрицы, а не отношения параметров, но это должно быть довольно легко исправить.
С другой стороны, насколько легко можно построить его в решетке (и я думаю, что он выглядит "чище":
require(lattice)
contourplot(mat, at=seq(.1,.9,.1))
Поскольку я думаю, что вопрос все еще актуален, произошли некоторые изменения в маркировке контурных metR
пакете metR
. Добавление к предыдущему примеру даст вам хорошую маркировку контуров также с помощью ggplot2
require(metR)
g + geom_text_contour(rotate = TRUE, nudge_x = 3, nudge_y = 5)