Tạo bản đồ nhiệt mật độ hấp dẫn trực quan trong R


27

Mặc dù tôi biết rằng có một loạt các chức năng để tạo bản đồ nhiệt trong R, nhưng vấn đề là tôi không thể tạo ra các bản đồ hấp dẫn trực quan. Ví dụ, những hình ảnh dưới đây là những ví dụ điển hình về bản đồ nhiệt mà tôi muốn tránh. Cái đầu tiên rõ ràng thiếu chi tiết, trong khi cái còn lại (dựa trên cùng một điểm) quá chi tiết sẽ không hữu ích. Cả hai ô đã được tạo bởi hàm mật độ () trong gói R spatstat .

Làm thế nào tôi có thể có thêm "dòng chảy" vào lô đất của mình? Những gì tôi đang hướng tới là phần lớn các kết quả của phần mềm SpatialKey ( ảnh chụp màn hình ) thương mại có thể tạo ra.

Bất kỳ gợi ý, thuật toán, gói hoặc dòng mã nào có thể đưa tôi đi theo hướng này?

nhập mô tả hình ảnh ở đây


bạn đã xem hàm image () chưa? Tăng số lần nghỉ sẽ tăng độ phân giải.
Macro

Câu trả lời:


28

Có hai điều sẽ tác động đến độ mượt của cốt truyện, băng thông được sử dụng cho ước tính mật độ hạt nhân của bạn và các khoảng nghỉ bạn gán màu cho trong ô.

Theo kinh nghiệm của tôi, để phân tích khám phá, tôi chỉ điều chỉnh băng thông cho đến khi tôi có được một âm mưu hữu ích. Trình diễn dưới đây.

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

nhập mô tả hình ảnh ở đây

Chỉ cần thay đổi lược đồ màu mặc định sẽ không giúp ích gì cả, cũng sẽ không thay đổi độ phân giải của pixel (nếu bất cứ điều gì độ phân giải mặc định quá chính xác và bạn nên giảm độ phân giải và làm cho pixel lớn hơn). Mặc dù bạn có thể muốn thay đổi bảng màu mặc định cho mục đích thẩm mỹ, nhưng nó có ý định phân biệt đối xử cao.

Những điều bạn có thể làm để giúp màu sắc thay đổi mức độ tỷ lệ thành logarit (sẽ thực sự chỉ có ích nếu bạn có một quy trình rất không đồng nhất), thay đổi bảng màu để thay đổi nhiều hơn ở cấp thấp hơn (sai lệch về đặc điểm kỹ thuật của dải màu trong R), hoặc điều chỉnh chú giải để có các thùng rời rạc thay vì liên tục.

Các ví dụ về sự thiên vị trong truyền thuyết được điều chỉnh từ đây và tôi có một bài đăng khác trên trang web GIS giải thích việc tô màu các thùng rời rạc trong một ví dụ khá đơn giản ở đây . Mặc dù vậy, những điều này sẽ không giúp ích nếu mô hình kết thúc hoặc được làm mịn mặc dù bắt đầu bằng.

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

nhập mô tả hình ảnh ở đây


Để làm cho màu trong suốt trong hình ảnh cuối cùng (trong đó thùng màu đầu tiên là màu trắng), người ta có thể chỉ cần tạo đoạn màu và sau đó thay thế thông số RGB bằng màu trong suốt. Ví dụ dưới đây sử dụng cùng một dữ liệu như trên.

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)

nhập mô tả hình ảnh ở đây


Cảm ơn bạn, câu trả lời rất rõ ràng bực bội. Điều này kết hợp với lệnh "spatstat.options (npixel = c (100.100))" mà bạn đã thực hiện để thực hiện thủ thuật. Nếu tôi có thể làm phiền bạn thêm một số: Bạn có biết làm thế nào tôi có thể làm cho màu "nền" trong suốt không?
Figaro

1
@Figaro, tôi đã cập nhật một ví dụ về làm cho màu sắc bán trong suốt.
Andy W

Cảm ơn bạn. Một điều nữa. Trong khi điều này có thể hơi lạc đề: Làm cách nào để xuất các bản đồ nhiệt này thành tệp Shape? Hay tôi được yêu cầu chỉ coi họ là người raster?
Figaro

Tôi chưa bao giờ phải làm điều đó, vì vậy tôi không thể nói ra. Có lẽ là một câu hỏi hay cho guru's trên stackoverflow.
Andy W

Một bản đồ nhiệt có thể được trình bày như bất cứ điều gì khác hơn là một raster?
Figaro

2

Bạn có thể hưởng lợi từ chức năng interp từ gói akima. Điều này sẽ cho phép bạn nội suy ma trận của bạn sang độ phân giải khác nếu cần. Để làm một cái gì đó giống như ví dụ được liên kết của bạn, bạn sẽ cần phải nội suy thành một lưới khá tốt (có lẽ với các đối số xo và yo có độ dài ~ 1000). Điều này sẽ cung cấp cho bạn một ma trận mới mà bạn có thể vẽ với hình ảnh (). Nếu bạn muốn minh bạch, điều này sẽ mất một số công việc bổ sung. Thật không dễ để làm điều đó với một bảng màu, vì vậy cuối cùng bạn có thể phải vẽ mỗi lưới thành một đa giác với một màu được gán.


Bạn có kinh nghiệm với việc tạo ra sự minh bạch? Có ví dụ không? Đó sẽ là bước tiếp theo.
Figaro

Làm cách nào để tạo các giá trị x, y, z cần thiết cho interp ()? Ví dụ: nếu mật độ () sử dụng lưới 100x100, tôi có các giá trị z cho mỗi điểm, nhưng tôi không có x & y ở định dạng vectơ cần thiết (tôi chỉ có tọa độ của các trục).
Figaro

Tạo một vòng lặp để có được các cặp tọa độ, nhưng có một chức năng cho việc này không?
Figaro

2
Dường như hình ảnh có thể chấp nhận màu trong suốt sau khi tất cả. Xem: menugget.blogspot.de/2012/04/ . Trong trường hợp bạn vẫn muốn sử dụng interp, bạn có thể tạo các tổ hợp tọa độ xy cho các cấp z của mình với: "lưới <- extend.grid (x = x, y = y)"
Marc trong hộp

1

Bạn có thể muốn xem xét ggplot2. Có vẻ như gói bạn đã thử không có phối màu hay "dòng chảy" tuyệt vời - hãy xem RColorBrewer. Có một blog nơi nó thực hiện các gói này với một ví dụ đơn giản.

Tôi không chắc liệu bạn có đang cố gắng vẽ biểu đồ dữ liệu địa lý như trong ví dụ được liên kết của mình không, nhưng nếu bạn biết rằng Google cung cấp "Hướng dẫn dành cho nhà phát triển API bản đồ tĩnh" và bạn có thể kết hợp Google và R với gói có tên là RgoogleMaps .

Chúc may mắn với nghiên cứu của bạn.


Xin lỗi nếu tôi không rõ ràng, nhưng ngay bây giờ vấn đề không phải là bảng màu. Tuy nhiên tôi đã thử RColorBrewer sớm hôm nay: một nhịp điệu nhỏ tuyệt vời! Đó là dữ liệu không gian, tôi không chắc chắn tôi muốn sử dụng Google API, nhưng tôi có thể xem qua.
Figaro

0

Bạn đã thử chỉnh sửa độ phân giải densitychưa? Hãy thử tranh luận dimyx=c(512, 512)hoặc cao hơn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.