gpt4 book ai didi

r - 使用 R 光栅进行交互式绘图 : values on mouseover

转载 作者:行者123 更新时间:2023-12-01 23:44:28 25 4
gpt4 key购买 nike

我想在 R 中编写一个小程序,用于交互式可视化和修改一些栅格数据集(视为彩色图像)。用户应该打开一个文件(从终端就可以了),绘制它,通过单击鼠标选择要编辑的点,然后插入新值。

到目前为止,我很容易做到这一点。我使用 raster 包中的 plot() 函数来可视化绘图,然后 click() 选择点并通过以下方式编辑它们的值终端。

我想添加在鼠标悬停时显示值的功能。我已经搜索了如何执行此操作的方法,但这对于标准 R 包似乎是不可能的。这是正确的吗?

在这种情况下,我可能被迫使用外部软件包,例如 gGobi、iPlots、Shiny 或 Plotly。但是,我非常喜欢 KISS并仅使用“标准”图形工具,例如光栅 plot() 函数或网格图形对象(例如来自 rasterVis)。

我知道 Shiny 的应用程序可能是最好的,但它需要大量的时间来学习和完善。

最佳答案

使用leafletmapviewleafem,您可以实现如下效果:

library(raster)
library(mapview)
library(leaflet)
library(leafem)

f <- system.file("external/test.grd", package="raster")
r <- raster(f)

leaflet() %>%
addRasterImage(r, layerId = "values") %>%
addMouseCoordinates() %>%
addImageQuery(r, type="mousemove", layerId = "values")
<小时/>

将其放入您得到的 Shiny 应用程序中:

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)
<小时/>

以下示例说明了将栅格转换为简单要素/形状文件的想法。它不适用于大文件,但标签可以单独设计,数据可编辑并且可以轻松显示在表格中。

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)

关于r - 使用 R 光栅进行交互式绘图 : values on mouseover,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30704487/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com