2012-02-17 29 views
18

Có cách nào để đảm bảo rằng hộp xung quanh một ô phù hợp chính xác với độ mở rộng raster không? Trong những điều sau có một khoảng cách trên và dưới hoặc bên trái và bên phải của raster tùy thuộc vào tỷ lệ thiết bị:Các trục ở mức tối thiểu, không có đệm, trong các ô raster * đối tượng

require(raster) 
r = raster() 
r[]= 1 
plot(r, xlim=c(xmin(r), xmax(r)), ylim=c(ymin(r), ymax(r))) 

Một yếu tố của vấn đề với các đối tượng raster là asp=1 để đảm bảo hiển thị đúng. Các phân tán cơ bản sau đây có vấn đề tương tự khi asp=1:

plot(c(1:10), c(1:10), asp=1) 

Hãy thử vectorplot(r) từ gói rasterVis để xem những gì tôi muốn các trục để trông giống như.

EDIT:

Giải pháp cần phải chơi đẹp với SpatialPoints lớp phủ, không hiển thị điểm bên ngoài các giới hạn raster định:

require(raster) 
require(maptools) 

# Raster 
r = raster() 
r[]= 1 

# Spatial points 
x = c(-100, 0, 100) 
y = c(100, 0, 100) 
points = SpatialPoints(data.frame(x,y)) 

plot(r, xlim=c(xmin(r), xmax(r)), ylim=c(ymin(r), ymax(r))) 
plot(points, add=T) 
+0

Tốt câu hỏi. Tôi đã tự hỏi rằng bản thân mình, gần đây, và rất vui vì bạn đã nghĩ đến việc hỏi ở đây. –

+0

Thật thú vị, điều này ám hoàn toàn trên thiết lập R của tôi. Tôi sử dụng R-2.11 64bit trên Win7, và nền màu vàng hoàn toàn lấp đầy khoảng trống raster. – Martin

+0

Tôi là R-2.13.1 Win7, x64. Nó lấp đầy mức raster, nhưng không phải toàn bộ hộp vẽ (các trục lớn hơn mức). – Benjamin

Trả lời

12

Bạn có thể muốn cố gắng hết sức để đi với một trong những lattice chức năng dựa trên cho âm mưu đối tượng raster không gian được cung cấp bởi các rasterrasterVis gói . Bạn đã khám phá một trong số họ trong số vectorplot(), nhưng spplot() hoặc levelplot() phù hợp hơn với nhu cầu của bạn trong trường hợp này.

(Phương pháp base graphics dựa trên plot() cho "RasterLayer" đối tượng chỉ không cho phép bất kỳ cách dễ dàng để bạn có thể thiết lập các trục với tỉ lệ thích hợp. Đối với bất cứ ai quan tâm, tôi đi vào chi tiết hơn về việc tại sao đó là như vậy trong một phần ở dưới cùng của bưu điện)

Như một ví dụ về các loại âm mưu mà levelplot() sản xuất:.

require(raster) 
require(rasterVis) 

## Create a raster and a SpatialPoints object. 
r <- raster() 
r[] <- 1:ncell(r) 
SP <- spsample(Spatial(bbox=bbox(r)), 10, type="random") 

## Then plot them  
levelplot(r, col.regions = rev(terrain.colors(255)), cuts=254, margin=FALSE) + 
layer(sp.points(SP, col = "red")) 

## Or use this, which produces the same plot. 
# spplot(r, scales = list(draw=TRUE), 
#  col.regions = rev(terrain.colors(255)), cuts=254) + 
# layer(sp.points(SP, col = "red")) 

enter image description here

Một trong những phương pháp này vẫn có thể vẽ một số phần của biểu tượng đại diện cho các điểm rơi ngay bên ngoài raster được vẽ. Nếu bạn muốn tránh rằng khả năng, bạn chỉ có thể đặt một đối tượng SpatialPoints để loại bỏ bất kỳ điểm nào rơi ra ngoài raster. Dưới đây là một chức năng đơn giản mà sẽ làm điều đó cho bạn:

## A function to test whether points fall within a raster's extent 
inExtent <- function(SP_obj, r_obj) { 
    crds <- [email protected] 
    ext <- extent(r_obj) 
    crds[,1] >= [email protected] & crds[,1] <= [email protected] & 
    crds[,2] >= [email protected] & crds[,2] <= [email protected] 
} 
## Remove any points in SP that don't fall within the extent of the raster 'r' 
SP <- SP[inExtent(SP, r), ] 

bổ sung chi tiết cỏ về việc tại sao thật khó để làm plot(r) sản xuất trục khít phù

Khi plot được gọi trên một đối tượng của loại raster, dữ liệu raster (cuối cùng) được vẽ bằng cách sử dụng rasterImage() hoặc image().Đường dẫn nào được theo sau phụ thuộc vào: (a) loại thiết bị được vẽ; và (b) giá trị của đối số useRaster trong lệnh gọi plot() gốc.

Trong cả hai trường hợp, khu vực vẽ đồ thị được thiết lập theo cách tạo ra các trục lấp đầy khu vực vẽ, thay vì theo cách cung cấp cho chúng tỷ lệ co thích hợp.

Dưới đây, tôi hiển thị chuỗi chức năng được gọi trên đường đến bước này, cũng như cuộc gọi cuối cùng thiết lập khu vực vẽ đồ thị. Trong cả hai trường hợp, dường như không có cách nào đơn giản để thay đổi cả mức độ và tỉ lệ khung hình của các trục được vẽ.

  • useRaster=TRUE

    ## Chain of functions dispatched by `plot(r, useRaster=TRUE)` 
    getMethod("plot", c("RasterLayer", "missing")) 
    raster:::.plotraster2 
    raster:::.rasterImagePlot 
    
    ## Call within .rasterImagePlot() that sets up the plotting region 
    plot(NA, NA, xlim = e[1:2], ylim = e[3:4], type = "n", 
          , xaxs = "i", yaxs = "i", asp = asp, ...) 
    
    ## Example showing why the above call produces the 'wrong' y-axis limits 
    plot(c(-180,180), c(-90,90), 
        xlim = c(-180,180), ylim = c(-90,90), pch = 16, 
        asp = 1, 
        main = "plot(r, useRaster=TRUE) -> \nincorrect y-axis limits") 
    
  • useRaster=FALSE

    ## Chain of functions dispatched by `plot(r, useRaster=FALSE)` 
    getMethod("plot", c("RasterLayer", "missing")) 
    raster:::.plotraster2 
    raster:::.imageplot 
    image.default 
    
    ## Call within image.default() that sets up the plotting region 
    plot(NA, NA, xlim = xlim, ylim = ylim, type = "n", xaxs = xaxs, 
        yaxs = yaxs, xlab = xlab, ylab = ylab, ...) 
    
    ## Example showing that the above call produces the wrong aspect ratio 
    plot(c(-180,180), c(-90,90), 
        xlim = c(-180,180), ylim = c(-90,90), pch = 16, 
        main = "plot(r,useRaster=FALSE) -> \nincorrect aspect ratio") 
    
+1

Bạn có bao giờ bị phân tách khi hiển thị raster với levelplot không? – Benjamin

+0

@Benjamin - Lần duy nhất tôi thấy bất kỳ dải phân cách nào là khi tôi tải lên một hình ảnh pdf của lô trên lên SO, và sau đó đã xem kết quả bằng trình duyệt Firefox của tôi. Được xem với Adobe, bản pdf gốc có vẻ ổn. Bạn định dạng hình ảnh ở những định dạng nào và với những gì bạn đang xem? (Tôi hỏi bởi vì điều này gần như chắc chắn có thể có nhiều hơn để làm với những yếu tố hơn với bất cứ điều gì về 'levelplot'.) –

+1

Ngay cả khi hiển thị trên màn hình tôi thấy striping. Lưu vào png hoặc pdf có cùng một vấn đề. Raster của tôi là khá lớn, có lẽ nó là để lại hàng ra? – Benjamin

1

Man, tôi đã bối rối và kết thúc chỉ chuyển màu foreground tắt để âm mưu. Sau đó, bạn có thể tận dụng thực tế là phương thức raster gọi là fields:::image.plot, cho phép bạn chỉ vẽ chú thích (lần thứ hai, lần này hiển thị mực!). Đây là thanh nha, nhưng làm việc trong trường hợp này:

par("fg" = NA) 
    plot(r, xlim = c(xmin(r), xmax(r)), ylim = c(ymin(r), ymax(r)), axes = FALSE) 
    par(new = TRUE,"fg" = "black") 
    plot(r, xlim = c(xmin(r), xmax(r)), ylim = c(ymin(r), ymax(r)), axes = FALSE, legend.only = TRUE) 
    axis(1, pos = -90, xpd = TRUE) 
    rect(-180,-90,180,90,xpd = TRUE) 
    ticks <- (ymin(r):ymax(r))[(ymin(r):ymax(r)) %% 20 == 0] 
    segments(xmin(r),ticks,xmin(r)-5,ticks, xpd = TRUE) 
    text(xmin(r),ticks,ticks,xpd=TRUE,pos=2) 
     title("sorry, this could probably be done in some more elegant way") 

enter image description here

+0

Cảm ơn câu trả lời. Thật không may, điều này không làm việc cho tôi vì tôi cần phải che phủ các đối tượng SpatialPoints, mà nên được che giấu nếu nằm ngoài phạm vi raster. – Benjamin

1

Đây là cách tôi giải quyết vấn đề này

require(raster) 
r = raster() 

# default for raster is 180 row by 360 cols = 64800 cells 
# fill with some values to make more interesting 
r[]= runif(64800, 1, 1000) 

# Set margin for text 
par(mar=c(2, 6, 6, 2)) 

# Set some controls for the raster cell colours and legend 

MyBrks<-c(0,1,4,16,64,256,1E20)         
MyLbls<-c("<1","<4","<16","<64","<256","<Max")  
MyClrs<-c("blue","cyan","yellow","pink","purple","red") 

# Plot raster without axes or box or legend 
# Note xlim and ylim don't seem do much unless you want to trim x and y 
plot(r, 
    col=MyClrs, 
    axes=FALSE, 
    box=FALSE, 
    legend=FALSE 
    ) 

# Set up the ranges and intervals for axes - you can get the min max 
# using xmin(r) and ymax(r) and so on if you like 
MyXFrm <- -180 
MyXTo <- 180 
MyXStp <- 60 
MyYFrm <- -90 
MyYTo <- 90 
MyYStp <- 30 

# Plot the axes 
axis(1,tick=TRUE,pos=ymin(r),las=1,at=seq(MyXFrm,MyXTo ,MyXStp)) 
axis(2,tick=TRUE,pos=xmin(r),las=1,at=seq(MyYFrm ,MyYTo ,MyYStp)) 

# Plot the legend use xpd to plot the legend outside the plot region 
par(xpd=TRUE) 
legend(MyXTo ,MyYTo , 
     legend=MyLbls[1:6],      
     col= MyClrs,    
     fill=Clrs[1:6],        
     bg=rgb(0,0,0,0.85),   
     cex=0.9, 
     text.col="white", 
     text.font=2,      
     border=NA     
    ) 

# Add some axis labels and a title 
text(-220,0,"Y",font=2) 
text(0,-130,"X",font=2) 
text(0,120,"My Raster",font=4,cex=1.5) 

What the plot looks like

0

tôi nghĩ là tốt nhất (hoặc đơn giản nhất) giải pháp là sử dụng image():

library(raster) 

# Raster 
r = raster() 
r[]= rnorm(ncell(r)) 

# Spatial points 
x = c(-100, 0, 100) 
y = c(100, 0, 100) 
points = SpatialPoints(data.frame(x,y)) 

# plot 
image(r) 
plot(points, add=T, pch=16, cex=2) 

raster plot with the image function

Các vấn đề liên quan