Створення візуально привабливих теплових карт щільності в R


27

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

Як я можу отримати більше "потоку" в мої сюжети? Те, на що я прагну, - це більше погляд на результати комерційного програмного забезпечення SpatialKey ( скріншот ).

Будь-які підказки, алгоритми, пакети чи рядки коду, які могли б перенести мене в цьому напрямку?

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


Ви подивилися на функцію 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, я оновив приклад зробити кольори напівпрозорими.
Енді Ш

Дякую. І ще одна річ. Хоча це може бути трохи поза темою: Як експортувати ці теплові карти у файл Shape? Або я зобов'язаний ставитися до них як до растрових?
Фігаро

Мені ніколи не доводилося цього робити, тому я не можу сказати з очей. Можливо, гарне запитання для гуру R щодо стартового потоку.
Andy W

Чи можна подати теплову карту як щось інше, ніж растр?
Фігаро

2

Ви можете скористатися функцією interp з пакету akima. Це дозволить вам інтерполювати матрицю на іншу роздільну здатність, якщо це буде необхідно. Щоб зробити щось подібне до вашого зв'язаного прикладу, вам потрібно буде інтерполювати до досить тонкої сітки (можливо, аргументи xo і yo мають довжину ~ 1000). Це дасть вам нову матрицю, яку ви зможете побудувати із зображенням (). Якщо ви хочете прозорості, це потребує додаткової роботи. Зробити це з палітрою кольорів непросто, тому вам може виникнути необхідність побудувати кожну сітку як багатокутник із призначеним кольором.


Чи маєте ви досвід створення прозорості? Чи є приклади? Це був би наступний крок.
Фігаро

Як створити значення x, y, z, необхідні для interp ()? Наприклад, якщо щільність () використовує сітку 100x100, у мене є значення z для кожної точки, але у мене немає x & y у необхідному векторному форматі (у мене є лише координати осей).
Фігаро

Зробив цикл для отримання пар координат, але чи є для цього функція?
Фігаро

2
Схоже, що зображення може сприймати прозорі кольори. Див: menugget.blogspot.de/2012/04 / ... . Якщо ви все ще хочете використовувати інтерп, ви можете створити свої комбінації xy координат для своїх z рівнів за допомогою: "grid <- expand.grid (x = x, y = y)"
Marc у полі

1

Ви можете заглянути в ggplot2. Схоже, упаковка, яку ви спробували, не має чудових кольорових схем або "потоку" - погляньте на RColorBrewer. Є блог, де він реалізував цей пакет з простим прикладом.

Я не впевнений, чи намагаєтесь ви побудувати географічні дані, як показано у зв'язаному прикладі, але якщо ви знаєте, що Google пропонує "Посібник для розробників API статичних карт", і ви можете комбінувати Google і R з пакетом під назвою RgoogleMaps .

Успіхів у ваших дослідженнях.


Вибачте, якщо мені було незрозуміло, але зараз питання не в самій кольоровій гамі. Проте я спробував RColorBrewer раніше: чудовий маленький пакунок! Це просторові дані, я не впевнений, що хочу використовувати API Google, але я можу мати вигляд.
Фігаро

0

Ви намагалися виконувати дозвіл density? Спробуйте аргументувати dimyx=c(512, 512)або вище.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.