Создание визуально привлекательных карт плотности плотности в R

27

Хотя я знаю, что существует ряд функций для генерации тепловых карт в R, проблема в том, что я не могу создавать визуально привлекательные карты. Например, изображения ниже являются хорошими примерами тепловых карт, которых я хочу избежать. В первом явно не хватает деталей, а в другом (основанном на тех же пунктах) слишком подробно, чтобы быть полезным. Оба графика были созданы с помощью функции density () в пакете spatstat R.

Как я могу получить больше «потока» на мои участки? То, к чему я стремлюсь, - это внешний вид, который могут дать результаты коммерческого программного обеспечения SpatialKey ( скриншот ).

Любые подсказки, алгоритмы, пакеты или строки кода, которые могут привести меня в этом направлении?

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

Figaro
источник
Вы смотрели на функцию image ()? Увеличение количества разрывов увеличивает разрешение.
Макрос

Ответы:

28

Есть две вещи, которые будут влиять на гладкость графика: полоса пропускания, используемая для оценки плотности ядра, и разрывы, которым вы назначаете цвета на графике.

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

library(spatstat)
set.seed(3)
X <- rpoispp(10)
par(mfrow = c(2,2))
plot(density(X, 1))
plot(density(X, 0.1))
plot(density(X, 0.05))
plot(density(X, 0.01))

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

Простое изменение цветовой схемы по умолчанию не поможет, равно как и изменение разрешения пикселей (если разрешение по умолчанию слишком точное, вам следует уменьшить разрешение и увеличить пиксели). Хотя вы можете изменить цветовую схему по умолчанию для эстетических целей, она предназначена для высокой степени дискриминации.

Вещи, которые вы можете сделать, чтобы помочь цвету, изменить уровень шкалы на логарифмы (это действительно поможет, только если у вас очень неоднородный процесс), изменить цветовую палитру, чтобы она менялась более низко (смещение в терминах спецификации цветовой шкалы в R) или измените легенду, чтобы иметь дискретные ячейки вместо непрерывных.

Примеры смещения в легенде адаптированы отсюда , и у меня есть еще один пост на сайте ГИС, объясняющий раскраску дискретных корзин в довольно простом примере здесь . Это не поможет, хотя, если шаблон закончен или недостаточно сглажен, хотя для начала.

Z <- density(X, 0.1)
logZ <- eval.im(log(Z))
bias_palette <- colorRampPalette(c("blue", "magenta", "red", "yellow", "white"), bias=2, space="Lab")
norm_palette <- colorRampPalette(c("white","red"))
par(mfrow = c(2,2))
plot(Z)
plot(logZ)
plot(Z, col=bias_palette(256))
plot(Z, col=norm_palette(5))

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


Чтобы сделать цвета прозрачными на последнем изображении (где первый цветовой контейнер белый), можно просто сгенерировать цветовую линейку и затем заменить спецификацию RGB прозрачными цветами. Пример ниже, используя те же данные, что и выше.

library(spatstat)
set.seed(3)
X <- rpoispp(10)
Z <- density(X, 0.1)
A <- rpoispp(100) #points other places than density


norm_palette <- colorRampPalette(c("white","red"))
pal_opaque <- norm_palette(5)
pal_trans <- norm_palette(5)
pal_trans[1] <- "#FFFFFF00" #was originally "#FFFFFF" 

par(mfrow = c(1,3))
plot(A, Main = "Opaque Density")
plot(Z, add=T, col = pal_opaque)
plot(A, Main = "Transparent Density")
plot(Z, add=T, col = pal_trans)


pal_trans2 <- paste(pal_opaque,"50",sep = "")
plot(A, Main = "All slightly transparent")
plot(Z, add=T, col = pal_trans2)

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

Энди У
источник
Спасибо, очень четко обиженный ответ. Это в сочетании с командой «spatstat.options (npixel = c (100,100))», с которой вы работали, сделали свое дело. Если я смогу побеспокоить вас еще: знаете, как я могу сделать цвет фона прозрачным?
Фигаро
1
@Figaro, я обновил пример создания полупрозрачных цветов.
Энди W
Спасибо. Еще кое-что. Хотя это может быть немного не по теме: как мне экспортировать эти тепловые карты в файл Shape? Или я должен рассматривать их только как растры?
Фигаро
Мне никогда не приходилось это делать, поэтому я не могу сказать, что это произошло. Вероятно, хороший вопрос для гуру R.
Энди W
Можно ли представить тепловую карту как что-то еще, кроме растра?
Фигаро
2

Вы можете воспользоваться функцией interp из пакета akima. Это позволит вам интерполировать вашу матрицу в другое разрешение, если это будет необходимо. Чтобы сделать что-то вроде вашего связанного примера, вам нужно будет интерполировать в довольно тонкую сетку (возможно, с аргументами xo и yo длиной ~ 1000). Это даст вам новую матрицу, которую вы можете построить с помощью image (). Если вы хотите прозрачности, это потребует дополнительной работы. Это нелегко сделать с помощью цветовой палитры, поэтому вам может понадобиться построить каждую сетку как многоугольник с назначенным цветом.

Марк в коробке
источник
У вас есть опыт создания прозрачности? Есть ли примеры? Это было бы следующим шагом.
Фигаро
Как мне создать значения x, y, z, необходимые для interp ()? Например, если плотность () использует сетку 100x100, у меня есть значения z для каждой точки, но у меня нет x & y в требуемом векторном формате (у меня есть только координаты осей).
Фигаро
Сделал цикл для получения координатных пар, но есть ли функция для этого?
Фигаро
2
Похоже, что изображение может принимать прозрачные цвета в конце концов. Смотрите: menugget.blogspot.de/2012/04/… . Если вы все еще хотите использовать interp, вы можете сгенерировать свои координаты xy для ваших уровней z с помощью: "grid <- expand.grid (x = x, y = y)"
Marc в поле
1

Вы можете посмотреть на ggplot2. Кажется, что у пакета, который вы пробовали, нет отличных цветовых схем или «потока» - взгляните на RColorBrewer. Есть блог, где реализован этот пакет с простым примером.

Я не уверен, что вы пытаетесь построить географические данные, как показано в связанном примере, но если вы знаете, Google предлагает «Руководство разработчика API Static Maps V2», и вы можете объединить Google и R с пакетом, называемым RgoogleMaps ,

Удачи в ваших исследованиях.

кругозор
источник
Извините, если мне было неясно, но сейчас проблема не в самой цветовой схеме. Однако сегодня я попробовал RColorBrewer: отличный маленький пакетик! Это пространственные данные, я не уверен, что хочу использовать API Google, но я мог бы взглянуть.
Фигаро
0

Вы пытались проверить разрешение в density? Попробуйте аргумент dimyx=c(512, 512)или выше.

Wayne
источник