создание более непрерывной цветовой палитры в r, ggplot2, lattice или latticeExtra

Предупреждение .... следует очень новичок вопрос:

Я пытаюсь построить довольно регулярное распределение нескольких тысяч (X, Y) точек, каждая из которых связана со значением, назовем Z, которое очень неравномерно изменяется, скажем, от -20 до +20. Меня не интересует сглаживание; Я хочу, чтобы значения точки Z отображались в соответствии с плавно меняющейся цветовой палитрой, так же, как Gnuplot может делать с правильной гладкой цветовой палитрой. Я пробовал base R, ggplot2 и latticeExtra, и, насколько я могу, могу придумать следующее, которое делает почти то, что я хочу:

library(lattice)
library(latticeExtra)
library(colorRamps)
df = read.table(file"whatever", header=T)
levelplot(Z~X*Y, df, panel=panel.levelplot.points, cex=0.2,
   col.regions=colorRampPalette(c("red","white","blue"))(50))

Одна точка данных выглядит так: 1302525 225167 -3,5

Когда я рисую свой фрейм данных с цифрой «50» в последней строке кода как 3, я получаю предсказуемое поведение повторного цикла R: красный, белый и синий цвета повторяются пять раз с 16-м сегментом шкалы белого цвета. Изменение 3 на 7 приводит к появлению большего количества оттенков красного и синего, создавая 2 повторяющихся сегмента цветового диапазона с двумя оставшимися красноватыми цветами, поскольку цветовой диапазон пытается переработать. Это предполагает, что увеличение этого числа приводит к более тонкой градации цветов. Но если я введу число больше 16, это все, что я получу, 16 цветных сегментов, равномерно меняющих цвет от красного до белого и синего. Но я бы хотел, чтобы цветовая шкала была еще более тонкой, и в идеальном мире заставил Z, равный нулю, быть белым цветом.

Мой опыт работы с R показывает, что когда я не могу сделать что-то настолько простое, как это, мне не хватает очень фундаментальной концепции. Что это?


person Plsvn    schedule 30.05.2011    source источник


Ответы (3)


Что касается решетки, вы можете настроить цветовую палитру с помощью RColorBrewer (или даже цветовое пространство). Используя пример, предоставленный @Chase, но с положительным значением для z:

dat <- data.frame(x = rnorm(1000), y = rnorm(1000), z = sample(0:40, 1000, TRUE))
library(RColorBrewer)
# see, e.g.
# display.brewer.all(9, type="seq")
# display.brewer.pal(11, "RdBu")
my.col <- colorRampPalette(brewer.pal(11, "RdBu"))(diff(range(dat$z)))
xyplot(y ~ x, data=dat, col=my.col[dat$z], pch=19, alpha=.5)

Обратите внимание, что здесь также необходимо увеличить диапазон доступных цветов путем интерполяции. Кроме того, с levelplot() вы можете поиграть с cut= и pretty=.

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

person chl    schedule 31.05.2011

Вы смотрели scale_gradient в ggplot? Или scale_brewer для дискретных цветов? Вот пример scale_gradient

dat <- data.frame(x = rnorm(1000), y = rnorm(1000), z = sample(-20:20, 1000, TRUE))

p <- ggplot(dat, aes(x, y, colour = z)) + geom_point() 
p + scale_colour_gradient()
p + scale_colour_gradient(low = "red", high = "blue")
p + scale_colour_gradient2(low = "red", mid = "white", high = "blue")
person Chase    schedule 31.05.2011
comment
Спасибо, Чейз, за ​​толчок в этом направлении. - person Plsvn; 31.05.2011

«Концепция», которую вам не хватает, - это аргумент at для levelplot(), который определяет точки останова между уровнями цвета и / или линиями контура. По умолчанию используется pretty(z), что дает всего несколько уровней. Вы можете установить at как последовательность, охватывающую диапазон значений, которые вы хотите.

library(latticeExtra)

dat <- data.frame(x = rnorm(1000), y = rnorm(1000), z = rnorm(1000, mean = 1))
## for centering the colour key around zero
maxz <- max(abs(dat$z))

levelplot(z ~ x * y, dat, at = seq(-maxz, maxz, length = 100), 
    panel = panel.levelplot.points, par.settings = custom.theme.2())
person Felix Andrews    schedule 31.05.2011