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.