fill.contour() в R: нелинейный диапазон клавиш

Я использую fill.contour() для построения данных, хранящихся в матрице. Данные генерируются (сильно) нелинейной функцией, поэтому их распределение совсем неравномерно, а диапазон очень велик.

Следовательно, я должен использовать опцию «уровни» для точной настройки сюжета. Однако fill.contour() не использует эти пользовательские уровни для создания соответствующего цветового ключа для тепловой карты, что я нахожу довольно удивительным.

Вот простой пример того, что я имею в виду:

    x = c(20:200/100)
    y = c(20:200/100)
    z = as.matrix(exp(x^2)) %*% exp(y^2)
    filled.contour(x=x,y=y,z=z,color.palette=colorRampPalette(c('green','yellow','red')),levels=c(1:60/3,30,50,150,250,1000,3000))

Как видите, цветовой ключ, созданный с помощью приведенного выше кода, практически бесполезен. Я хотел бы использовать какую-то проекцию (возможно, sin (x) или tanh (x)?), чтобы верхний диапазон не был чрезмерно представлен в ключе (линейным образом).

На данный момент я хотел бы:

1) узнайте, есть ли что-то очень простое/очевидное, что мне не хватает, например: возможность сделать эту «адаптацию диапазона клавиш» автоматически; 2) искать предложения/помощь о том, как сделать это самостоятельно, если ответ на 1) отрицательный.

Большое спасибо!

PS: Прошу прощения за мой английский, он далек от совершенства. Пожалуйста, дайте мне знать, если вам нужно, чтобы я что-то прояснил.


person dd_rlwll    schedule 22.07.2013    source источник


Ответы (1)


Я чувствую твое разочарование. Я никогда не находил способ сделать это с помощью filled contour, поэтому обычно возвращался к использованию image, а затем добавлял свою собственную шкалу в виде отдельного графика. Я написал функцию image.scale, чтобы помочь с этим (ссылка ). Ниже приведен пример того, как вы можете выполнить логарифмическое преобразование для вашей шкалы, чтобы растянуть небольшие значения, а затем пометить шкалу значениями без логарифмического преобразования в качестве меток:

Пример:

source("image.scale.R") # http://menugget.blogspot.de/2011/08/adding-scale-to-image-plot.html

x = c(20:200/100)
y = c(20:200/100)
z = as.matrix(exp(x^2)) %*% exp(y^2)

pal <- colorRampPalette(c('green','yellow','red'))
breaks <- c(1:60/3,30,50,150,250,1000,3000)
ncolors <- length(breaks)-1
labs <- c(0.5, 1, 3,30,50,150,250,1000,3000)

#x11(width=6, height=6)
layout(matrix(1:2, nrow=1, ncol=2), widths=c(5,1), heights=c(6))
layout.show(2)

par(mar=c(5,5,1,1))
image(x=x,y=y,z=log(z), col=pal(ncolors), breaks=log(breaks))
box()

par(mar=c(5,0,1,4))
image.scale(log(z), col=pal(ncolors), breaks=log(breaks), horiz=FALSE, xlab="", ylab="", xaxt="n", yaxt="n")
axis(4, at=log(labs), labels=labs)
box()

Результат:

введите здесь описание изображения

person Marc in the box    schedule 22.07.2013
comment
Это подойдет. Большое спасибо! - person dd_rlwll; 23.07.2013