Menghasilkan peta panas kepadatan yang menarik secara visual di R


27

Meskipun saya tahu bahwa ada serangkaian fungsi untuk menghasilkan peta panas di R, masalahnya adalah bahwa saya tidak dapat menghasilkan peta yang menarik secara visual. Misalnya, gambar di bawah adalah contoh peta panas yang baik yang ingin saya hindari. Yang pertama jelas kurang detail, sedangkan yang lain (berdasarkan poin yang sama) terlalu detail untuk berguna. Kedua plot telah dihasilkan oleh fungsi density () dalam paket spatstat R.

Bagaimana saya bisa mendapatkan lebih banyak "aliran" ke dalam plot saya? Yang saya tuju adalah lebih banyak hasil yang dapat dihasilkan oleh perangkat lunak SpatialKey ( tangkapan layar ) komersial .

Adakah petunjuk, algoritme, paket, atau baris kode yang dapat membawa saya ke arah ini?

masukkan deskripsi gambar di sini


sudahkah Anda melihat fungsi gambar ()? Meningkatkan jumlah jeda meningkatkan resolusi.
Makro

Jawaban:


28

Ada dua hal yang akan memengaruhi kelancaran plot, bandwidth yang digunakan untuk estimasi kepadatan kernel Anda dan waktu istirahat yang Anda berikan warna pada plot.

Dalam pengalaman saya, untuk analisis eksplorasi saya hanya menyesuaikan bandwidth sampai saya mendapatkan plot yang bermanfaat. Demonstrasi di bawah.

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

masukkan deskripsi gambar di sini

Hanya mengubah skema warna default tidak akan membantu, juga tidak akan mengubah resolusi piksel (jika ada resolusi default terlalu tepat, dan Anda harus mengurangi resolusi dan membuat piksel lebih besar). Meskipun Anda mungkin ingin mengubah skema warna default untuk tujuan estetika, itu dimaksudkan untuk sangat diskriminatif.

Hal yang dapat Anda lakukan untuk membantu warna adalah mengubah level skala menjadi logaritma (benar-benar hanya akan membantu jika Anda memiliki proses yang sangat tidak homogen), ubah palet warna agar lebih bervariasi di bagian bawah (bias dalam hal spesifikasi ramp warna di R), atau sesuaikan legenda untuk memiliki tempat sampah bukan terus menerus.

Contoh bias dalam legenda yang diadaptasi dari sini , dan saya punya posting lain di situs GIS yang menjelaskan pewarnaan tempat sampah dalam contoh yang cukup sederhana di sini . Ini tidak akan membantu meskipun jika polanya lebih atau kurang dihaluskan untuk memulainya.

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

masukkan deskripsi gambar di sini


Untuk membuat warna transparan pada gambar terakhir (di mana nampan warna pertama adalah putih) kita bisa menghasilkan ramp warna dan kemudian mengganti spesifikasi RGB dengan warna transparan. Contoh di bawah ini menggunakan data yang sama seperti di atas.

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)

masukkan deskripsi gambar di sini


Terima kasih, jawaban yang jelas-jelas membenci. Ini dikombinasikan dengan perintah "spatstat.options (npixel = c (100.100))" yang Anda antre melakukan triknya. Jika saya bisa mengganggu Anda lagi: Apakah Anda tahu bagaimana saya bisa membuat warna "latar belakang" transparan?
Figaro

1
@ Figaro, saya telah memperbarui dengan contoh membuat warna semi-transparan.
Andy W

Terima kasih. Satu hal lagi. Meskipun ini mungkin sedikit keluar dari topik: Bagaimana cara mengekspor heatmaps ini ke file Shape? Atau apakah saya diharuskan memperlakukan mereka hanya sebagai raster?
Figaro

Saya tidak pernah harus melakukan itu, jadi saya tidak bisa mengatakannya begitu saja. Mungkin pertanyaan yang bagus untuk guru R di stackoverflow.
Andy W

Bisakah heatmap disajikan sebagai selain raster?
Figaro

2

Anda dapat memanfaatkan fungsi interp dari paket akima. Ini akan memungkinkan Anda menginterpolasi matriks Anda ke resolusi lain jika perlu. Untuk membuat sesuatu seperti contoh yang ditautkan, Anda perlu menginterpolasi ke kisi yang cukup bagus (mungkin dengan argumen xo dan yo panjangnya ~ 1000). Ini akan memberi Anda matriks baru yang dapat Anda plot dengan image (). Jika Anda ingin transparansi, ini akan membutuhkan beberapa pekerjaan tambahan. Tidak mudah melakukannya dengan palet warna, jadi Anda mungkin harus memplot setiap kisi sebagai poligon dengan warna yang ditentukan.


Apakah Anda memiliki pengalaman dalam menciptakan transparansi? Apakah ada contoh? Itu akan menjadi langkah selanjutnya.
Figaro

Bagaimana cara membuat nilai x, y, z yang diperlukan untuk interp ()? Misalnya, jika densitas () menggunakan kisi 100x100, saya memiliki nilai z untuk setiap titik, tetapi saya tidak memiliki x & y dalam format vektor yang diperlukan (saya hanya memiliki koordinat gandar).
Figaro

Membuat loop untuk mendapatkan pasangan koordinat, tetapi apakah ada fungsi untuk ini?
Figaro

2
Sepertinya gambar bisa menerima warna transparan. Lihat: menugget.blogspot.de/2012/04/… . Jika Anda masih ingin menggunakan interp, Anda dapat menghasilkan kombinasi koordinat xy Anda untuk level z Anda dengan: "kisi <- expand.grid (x = x, y = y)"
Marc di dalam kotak

1

Anda mungkin ingin melihat ke ggplot2. Sepertinya paket yang Anda coba tidak memiliki skema warna yang hebat atau "aliran" - lihat RColorBrewer. Ada blog tempat paket ini diimplementasikan dengan contoh sederhana.

Saya tidak yakin apakah Anda mencoba untuk memplot data geografis seperti yang ditunjukkan dalam contoh yang ditautkan, tetapi jika Anda melakukannya, saya tahu bahwa Google menawarkan "Static Maps API V2 Developer Guide" dan Anda dapat menggabungkan Google dan R dengan paket yang disebut, RgoogleMaps .

Semoga berhasil dengan riset Anda.


Maaf jika saya tidak jelas, tetapi sekarang masalahnya bukan skema warna itu sendiri. Namun saya mencoba RColorBrewer sebelumnya hari ini: pacakge kecil yang hebat! Ini adalah data spasial, saya tidak yakin ingin menggunakan Google API, tapi saya mungkin melihatnya.
Figaro

0

Sudahkah Anda mencoba memperbaiki resolusi density? Coba argumen dimyx=c(512, 512)atau lebih tinggi.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.