使用R栅格进行交互式绘图:鼠标悬停时的值

时间:2015-06-08 08:35:39

标签: r plot mouseover interactive r-raster

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

到目前为止,我很容易实现这一目标。我使用plot()包中的raster函数来显示绘图,然后click()选择点并通过终端编辑它们的值。

我想添加在鼠标悬停时显示值的功能。我已经搜索了如何做到这一点的方法,但这似乎不适用于标准的R包。这是对的吗?

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

我理解一个Shiny应用程序可能是最好的,但需要花费大量时间来学习和完善。

2 个答案:

答案 0 :(得分:5)

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

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

将其放置在闪亮应用中,您将得到:

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的想法。它不适用于大文件,但标签可以单独设计,数据可以可编辑,并且可以轻松地显示在表格中。

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)

答案 1 :(得分:2)

我给您一个简单的示例,说明如何在R中无需外部Java库就可以做到这一点,如果您希望Javan的功能可以适应它,但是每个Java图形库都是不同的,并且我从未做过类似的事情。

client = SoftLayer.create_client_from_env(username="username",
                                          api_key="api_key",
                                          proxy="proxy")
sl_billing_invoice = client['Billing_Invoice']
try:
    result = sl_billing_invoice.getItems(id=id)
    print result
except SoftLayer.SoftLayerAPIError as sl_exc:
    msg = 'result:(%s, %s)' % (sl_exc.faultCode, sl_exc.faultString)
    print msg

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