首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用R光栅进行交互式绘图:鼠标上方的值

用R光栅进行交互式绘图:鼠标上方的值
EN

Stack Overflow用户
提问于 2015-06-08 08:35:38
回答 2查看 3.5K关注 0票数 24

我想在R中做一个小程序,用于交互可视化和修改一些光栅数据集,这些数据集被看作是彩色图像。用户应该打开一个文件(从终端它可以),绘制它,选择点编辑鼠标点击,并插入新的值。

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

我想添加在鼠标上显示值的能力。我已经找到了如何做到这一点的方法,但是标准的R包似乎不可能做到这一点。这是正确的吗?

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-06-25 19:44:44

使用leafletmapviewleafem,您可以实现如下目标:

代码语言:javascript
复制
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")

将其放入闪亮的应用程序中:

代码语言:javascript
复制
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)

下面的示例说明了将光栅转换为简单特性/Shapefile的想法。它不适用于大文件,但标签可以单独设计,数据是可编辑的,可以很容易地显示在一个表中。

代码语言:javascript
复制
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)
票数 16
EN

Stack Overflow用户

发布于 2018-06-25 07:42:30

我给出了一个简单的例子,说明如何在没有外部Java库的情况下在R中实现它,如果您想要Javan的特性,您可以修改它,但是每个java图形库是不同的,而且我从来没有做过类似的事情。

代码语言:javascript
复制
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)

若要退出,请在定位器处于活动状态时按Esc。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30704487

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档