создание более непрерывной цветовой палитры в r, ggplot2, lattice или latticeExtra - PullRequest
7 голосов
/ 31 мая 2011

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

Я пытаюсь построить довольно регулярное распределение из нескольких тысяч (X, Y) точек, каждая из которых связана со значением, назовем Z, который очень сильно меняетсянерегулярно, скажем, от -20 до +20.Я не заинтересован в сглаживании;Я хочу, чтобы значения точки Z отображались в соответствии с плавно меняющейся цветовой палитрой, так же, как Gnuplot может делать с правильной гладкой цветовой палитрой.Я пробовал базы 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 таков: когда я не могу сделать что-то столь простое, я упускаю очень фундаментальную концепцию.Что это?

Ответы [ 3 ]

11 голосов
/ 31 мая 2011

Что касается решетки, вы можете настроить свою цветовую палитру с помощью 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=.

enter image description here

7 голосов
/ 31 мая 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")
6 голосов
/ 31 мая 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())
...