Gerando mapas de calor de densidade visualmente atraentes em R

27

Embora eu saiba que há uma série de funções para gerar mapas de calor em R, o problema é que não consigo produzir mapas visualmente atraentes. Por exemplo, as imagens abaixo são bons exemplos de mapas de calor que eu quero evitar. O primeiro claramente carece de detalhes, enquanto o outro (baseado nos mesmos pontos) é muito detalhado para ser útil. Ambos os gráficos foram gerados pela função density () no espaço pacote R.

Como posso obter mais "fluxo" nas minhas parcelas? O que eu estou buscando é mais olhar os resultados do SpatialKey comercial ( captura de tela ) é capaz de produzir.

Alguma dica, algoritmo, pacote ou linha de código que possa me levar nessa direção?

insira a descrição da imagem aqui

Figaro
fonte
você olhou para a função image ()? Aumentar o número de quebras aumenta a resolução.
Macro

Respostas:

28

Há duas coisas que afetarão a suavidade da plotagem, a largura de banda usada para a estimativa de densidade do kernel e as quebras às quais você atribui cores na plotagem.

Na minha experiência, para análise exploratória, apenas ajusto a largura de banda até obter um gráfico útil. Demonstração abaixo.

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))

insira a descrição da imagem aqui

Simplesmente alterar o esquema de cores padrão não ajudará ninguém, nem alterará a resolução dos pixels (se alguma coisa a resolução padrão for muito precisa, você deverá reduzir a resolução e aumentar os pixels). Embora você queira alterar o esquema de cores padrão para fins estéticos, ele é altamente discriminatório.

Coisas que você pode fazer para ajudar a cor é alterar o nível de escala para logaritmos (será realmente só ajuda se você tem um muito processo não homogêneo), alterar a paleta de cores a variar mais na extremidade inferior (bias em termos de especificação de rampa de cores em R) ou ajuste a legenda para ter posições discretas em vez de contínuas.

Exemplos de viés na lenda adaptados daqui , e eu tenho outro post no site GIS explicando a coloração dos compartimentos discretos em um exemplo bastante simples aqui . Isso não ajudará se o padrão estiver acima ou abaixo da suavização, para começar.

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))

insira a descrição da imagem aqui


Para tornar as cores transparentes na última imagem (onde a primeira bandeja de cores é branca), basta gerar a rampa de cores e substituir a especificação RGB por cores transparentes. Exemplo abaixo usando os mesmos dados que acima.

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)

insira a descrição da imagem aqui

Andy W
fonte
Obrigado, muito claramente se ressentiu resposta. Isso combinado com o comando "spatstat.options (npixel = c (100,100))" ao qual você fez o alinhamento. Se eu puder incomodá-lo um pouco mais: você sabe como posso tornar a cor do "plano de fundo" transparente?
Figaro
1
@Figaro, atualizei com um exemplo de como tornar as cores semi-transparentes.
21712 Andy W
Obrigado. Mais uma coisa. Embora isso possa ser um pouco fora do tópico: Como exportar esses mapas de calor para um arquivo Shape? Ou sou obrigado a tratá-los apenas como rasters?
Figaro
Eu nunca tive que fazer isso, então não posso dizer de imediato. Provavelmente uma boa pergunta para os gurus do R no stackoverflow.
21712 Andy W
Um mapa de calor pode ser apresentado como algo além de uma varredura?
Figaro
2

Você pode se beneficiar da função interp do pacote akima. Isso permitirá que você interpole sua matriz para outra resolução, se necessário. Para criar algo parecido com o seu exemplo vinculado, você precisaria interpolar para uma grade bem fina (talvez com os argumentos xo e yo tendo ~ 1000 comprimento). Isso fornecerá uma nova matriz que você pode plotar com image (). Se você deseja transparência, isso exigirá algum trabalho adicional. Não é fácil fazer isso com uma paleta de cores; portanto, você pode ter que plotar cada grade como um polígono com uma cor atribuída.

Marc na caixa
fonte
Você tem experiência em criar a transparência? Existem exemplos? Esse seria o próximo passo.
Figaro
Como crio os valores x, y, z necessários para o interp ()? Por exemplo, se density () usa uma grade de 100x100, tenho os valores de z para cada ponto, mas não tenho x & y no formato vetorial necessário (tenho apenas as coordenadas dos eixos).
Figaro
Fez um loop para obter os pares de coordenadas, mas existe uma função para isso?
Figaro
2
Afinal, a imagem pode aceitar cores transparentes. Veja: menugget.blogspot.de/2012/04/… . Caso ainda deseje usar interp, você pode gerar suas combinações de coordenadas xy para seus níveis z com: "grid <- expand.grid (x = x, y = y)"
Marc na caixa
1

Você pode querer olhar para o ggplot2. Parece que o pacote que você tentou não possui ótimos esquemas de cores ou "fluxo" - dê uma olhada no RColorBrewer. Há um blog onde ele implementou esses pacotes com um exemplo simples.

Não tenho certeza se você está tentando plotar dados geográficos conforme mostrado no exemplo vinculado, mas se você sabe que o Google oferece o "Guia do desenvolvedor da API do Google Static Maps V2" e você pode combinar o Google e o R com um pacote chamado RgoogleMaps .

Boa sorte com sua pesquisa.

Ken
fonte
Desculpe se eu não estava claro, mas no momento o problema não é o esquema de cores em si. No entanto, tentei o RColorBrewer hoje mais cedo: um ótimo pequeno pacakge! São dados espaciais, não tenho certeza se quero usar as APIs do Google, mas posso dar uma olhada.
Figaro
0

Você já tentou aumentar a resolução density? Tente argumento dimyx=c(512, 512)ou superior.

Wayne
fonte