style libreria layers examples div circles r plot mouseover interactive r-raster

libreria - Trazado interactivo con ráster R: valores en mouseover



tags$div shiny (2)

Con el leaflet y el mapview puedes lograr algo como esto:

library(raster) library(mapview) library(leaflet) f <- system.file("external/test.grd", package="raster") r <- raster(f) leaflet() %>% addRasterImage(r, layerId = "values") %>% addMouseCoordinates() %>% addImageQuery(r, type="mousemove", layerId = "values")

Poniéndolo en una aplicación brillante obtienes:

library(raster) library(mapview) library(leaflet) library(shiny) f <- system.file("external/test.grd", package="raster") r <- raster(f) ui <- fluidPage( leafletOutput("map") ) server <- function(input, output){ output$map <- renderLeaflet({ leaflet() %>% addRasterImage(r, layerId = "values") %>% addMouseCoordinates() %>% addImageQuery(r, type="mousemove", layerId = "values") }) } shinyApp(ui, server)

El siguiente ejemplo ilustra la idea de convertir el ráster a Características simples / Shapefiles. No es realmente utilizable para archivos grandes, pero las etiquetas se pueden diseñar individualmente, los datos son editables y se pueden mostrar fácilmente en una Tabla.

library(raster) library(leaflet) library(shiny) library(sf) library(DT) library(dplyr) ## DATA f <- system.file("external/test.grd", package="raster") r <- raster(f) r1 = aggregate(r, 30) sp = st_as_sf(rasterToPolygons(r1)) cn = st_coordinates(st_transform(st_centroid(sp),4326)) sp = st_transform(sp, 4326) sp = cbind(sp, cn) sp$id <- 1:nrow(sp) colnames(sp)[1] <- "value" ## UI ui <- fluidPage( leafletOutput("map"), uiOutput("newValueUI"), textInput("newVal", label = "Enter new value"), actionButton("enter", "Enter new value"), hr(), dataTableOutput("table") ) ## SERVER server <- function(input, output){ ## Reactive Shapefile sp_react <- reactiveValues(sp = sp) ## Leaflet Map output$map <- renderLeaflet({ pal= colorNumeric(topo.colors(25), sp_react$sp$value) leaflet() %>% addPolygons(data = sp_react$sp, label= paste( "Lng: ", as.character(round(sp_react$sp$X,4)), "Lat: ", as.character(round(sp_react$sp$Y,4)), "Val: ", as.character(round(sp_react$sp$value,4))), color = ~pal(sp_react$sp$value), layerId = sp_react$sp$id ) }) ## Observe Map Clicks observeEvent(input$map_shape_click, { click_id = input$map_shape_click$id click_grid <- sp_react$sp[sp_react$sp$id == click_id,] }) ## Observe Action Button observeEvent(input$enter, { click_id <- input$map_shape_click$id sp_react$sp[sp_react$sp$id == click_id,]$value <- as.numeric(input$newVal) }) ## Data Table output$table <- DT::renderDataTable({ sp_react$sp %>% st_set_geometry(NULL) %>% dplyr::select(id,X,Y,value) }) proxy = dataTableProxy(''table'') ## Table Proxy observeEvent(input$map_shape_click$id, { req(input$map_shape_click$id) proxy %>% selectRows(as.numeric(input$map_shape_click$id)) }) } shinyApp(ui, server)

Me gustaría hacer un pequeño programa en R para la visualización interactiva y la modificación de algunos datasets ráster, vistos como imágenes en color. El usuario debe abrir un archivo (desde el terminal está bien), trazarlo, seleccionar los puntos para editar con clics del mouse e insertar los nuevos valores.

Hasta ahora lo he conseguido fácilmente. Utilizo la función plot() del paquete raster para visualizar el gráfico, luego hago click() para seleccionar los puntos y editar su valor a través del terminal.

Me gustaría agregar la capacidad de mostrar los valores al pasar el mouse por encima. He buscado formas de cómo hacer esto, pero esto no parece ser posible con los paquetes R estándar. ¿Es esto correcto?

En este caso, me pueden obligar a usar paquetes externos, como gGobi, iPlots, Shiny o Plotly. Sin embargo, prefiero KISS y usar solo herramientas de gráficos "estándar", como la función plot() raster o tal vez objetos gráficos enrejados (por ejemplo, de rasterVis ).

Entiendo que una aplicación Shiny probablemente sería la mejor, pero se necesita mucho tiempo para aprender y perfeccionar.


Te doy un ejemplo simple de cómo hacerlo en R sin bibliotecas Java externas. Si quieres las características de Javan, puedes adaptarlo, pero cada biblioteca de gráficos Java es diferente y nunca he hecho nada similar.

set.seed(123) mydata <- data.frame(x = runif(10), y = runif(10)) edit_plot <- function(data) { plot(data) sel <- locator(n = 1) if(is.null(sel)) return(TRUE) dd <- (data$x - sel$x)^2 + (data$y - sel$y)^2 data[which.min(dd),] <- edit(data[which.min(dd),]) r <- edit_plot(data) if(r) return(TRUE) } edit_plot(mydata)

Para salir presione Esc cuando el localizador esté activo.