r

r - shiny using html



Ejes en extensión mínima, sin relleno, en parcelas de objetos raster* (4)

Así es como resolví este problema.

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)

¿Hay alguna forma de garantizar que el cuadro alrededor de una parcela coincida exactamente con la extensión de la trama? En lo siguiente, hay un espacio arriba y abajo o a la izquierda y derecha del ráster según las proporciones del dispositivo:

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

Un elemento del problema con los objetos ráster es que asp=1 para garantizar una visualización adecuada. El siguiente diagrama de dispersión básico tiene el mismo problema cuando asp=1 :

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

Pruebe vectorplot(r) del paquete rasterVis para ver cómo quiero que se vean los ejes.

EDITAR:

Las soluciones deben jugar bien con las superposiciones de SpatialPoints, no mostrar puntos fuera de los límites de ráster especificados:

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)


Creo que la mejor (o la más simple) solución es usar 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)


Hombre, me quedé perplejo y terminé simplemente cambiando el color de primer plano para trazar. Luego, puede aprovechar el hecho de que el método de trazado de trama llama a los fields:::image.plot , que le permite simplemente trazar la leyenda (¡una segunda vez, esta vez mostrando la tinta!). Esto es poco elegante, pero funcionó en este caso:

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


Probablemente harías lo mejor para ir con una de las funciones basadas en lattice para trazar objetos raster espaciales proporcionados por los paquetes raster y rasterVis . Descubrió uno de ellos en vectorplot() , pero spplot() o levelplot() ajustan mejor a sus necesidades en este caso.

(El método plot() basado en base graphics base para los objetos "RasterLayer" simplemente no le permite ninguna manera fácil de establecer ejes con la relación de aspecto adecuada. Para cualquier persona interesada, "RasterLayer" más detalladamente por qué es así en una sección en la parte inferior del post)

Como ejemplo del tipo de gráfico que levelplot() produce:

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

Cualquiera de estos métodos todavía puede trazar una parte del símbolo que representa los puntos que se encuentran justo fuera del ráster trazado. Si desea evitar esa posibilidad, simplemente puede SpatialPoints su objeto SpatialPoints para eliminar cualquier punto que quede fuera del ráster. Aquí hay una función simple que lo hará por ti:

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

Detalles adicionales sobre por qué es difícil hacer que plot(r) produzca ejes que se ajusten perfectamente

Cuando se llama a plot en un objeto de tipo raster , los datos de raster se trazan (en última instancia) con rasterImage() o image() . La ruta que se sigue depende de: (a) el tipo de dispositivo que se va a trazar; y (b) el valor del argumento useRaster en la llamada original de plot() .

En cualquier caso, la región de trazado se configura de una manera que produce ejes que llenan la región de trazado, en lugar de una forma que les da la relación de aspecto adecuada.

A continuación, muestro la cadena de funciones que se llama en este paso, así como la llamada que, en última instancia, configura la región de trazado. En ambos casos, no parece haber una manera sencilla de alterar tanto la extensión como la relación de aspecto de los ejes que se trazan.

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