Rshiny:单击多边形时显示图表

用户12914910

我是一个非常渴望学习的Rshiny新手,但现在我正面临一个我无法独自克服的问题,如果有人可以帮助我,我将不胜感激!:)

我的问题是(我想)很简单:

我已经用多边形创建了地图,单击时设法显示了一些基本信息(在这里查看),但是我不知道如何在地图下方为每个多边形添加条形图(例如)我点击。

有人可以帮我吗?(经过数小时的尝试,我的眼球真的要从插槽中弹出了!!!)

提前谢谢了 !

罗曼

我的代码:

library(shiny)
library(leaflet)
library(dplyr)
library(magrittr)
library(devtools)
library(RColorBrewer)
library(rgdal)
library(sp)

communes <- readOGR("G:/Ateliers/Projet/communes.shp")
commmunes@data

nom_commune                 INSEE  Variable_1   Variable_2  Variable_3 area_sqkm
1    AUZEVILLE-TOLOSANE     31035         289     8.727212    9.336384  6.979758
2      CASTANET-TOLOSAN     31113          85     4.384877    8.891650  8.460724
3                LABEGE     31254         288     5.047406    2.031651  7.663404
4            PECHBUSQUE     31411         443     6.577743    8.120896  3.099422
5 RAMONVILLE-SAINT-AGNE     31446          95     2.601305    8.909278  6.236784
> 




ui <- fluidPage(
  leafletOutput("mymap"))


  #### SERVEUR R #####


  bins <- c(3,3.5,6,6.5,7,7.5,8,8.5)
  pal <- colorBin("YlOrRd", domain = communes$area_sqkm, bins = bins) 
  labels <- sprintf(
    "<strong>%s</strong><br/>%g km2",
    communes$nom_commun, communes$area_sqkm
  ) %>% lapply(htmltools::HTML)

server <- function(input, output, session) {
  output$mymap<-renderLeaflet(
    leaflet(communes) %>%
      addProviderTiles(providers$Stamen.TonerLite,
                       options = providerTileOptions(noWrap = TRUE)
      ) %>%
      setView(1.50, 43.54, zoom = 12) %>%
      addTiles()  %>% 
      addPolygons(fillColor = ~pal(area_sqkm),
                  weight = 2,
                  opacity = 1,
                  color = "white",
                  dashArray = "3",
                  fillOpacity = 0.7,
                  highlight = highlightOptions(
                    weight = 5,
                    color = "#666",
                    dashArray = "",
                    fillOpacity = 0.7,
                    bringToFront = TRUE),
                  label = labels,
                  labelOptions = labelOptions(
                    style = list("font-weight" = "normal", padding = "3px 8px"),
                    textsize = "15px",
                    direction = "auto")) %>% 
      addLegend(pal = pal, values = ~area_sqkm, opacity = 0.7, title = NULL,
                position = "bottomright")
  )
}     


shinyApp(ui = ui, server=server)

我想在条形图中显示的数据是变量1,2和3:

data <- read.csv("G:/Ateliers/Projet/communes.csv", sep=";")
data

nom_commune                 INSEE  Variable_1   Variable_2  Variable_3 area_sqkm
1    AUZEVILLE-TOLOSANE     31035         289     8.727212    9.336384  6.979758
2      CASTANET-TOLOSAN     31113          85     4.384877    8.891650  8.460724
3                LABEGE     31254         288     5.047406    2.031651  7.663404
4            PECHBUSQUE     31411         443     6.577743    8.120896  3.099422
5 RAMONVILLE-SAINT-AGNE     31446          95     2.601305    8.909278  6.236784
> 
Ben

这是一个带有其他数据的闪亮应用示例,因为我无法访问您的地图形状数据。我相信这可能会满足您的需求,并且可以适应您的需求。

我将创建一个reactiveVal以存储id被单击的多边形区域的(此变量存储input$mymap_shape_click$id)。您用于的数据addPolygons应有id参考。

在你的阴谋(或在一个单独的reactive表达式),就可以过滤基于该数据reactiveVal包含id

library(shiny)
library(leaflet)
library(rgdal)
library(sf)
library(ggplot2)
library(tidyverse)

arcgis_data = st_read("http://data.phl.opendata.arcgis.com/datasets/bc2b2e8e356742568e43b0128c344d03_0.geojson")

arcgis_data$id <- 1:nrow(arcgis_data)  ## Add an 'id' value to each shape

plot_data <- read.table(text =
"id nom_commune                 INSEE  Variable_1   Variable_2  Variable_3 area_sqkm
1    AUZEVILLE-TOLOSANE     31035         289     8.727212    9.336384  6.979758
2      CASTANET-TOLOSAN     31113          85     4.384877    8.891650  8.460724
3                LABEGE     31254         288     5.047406    2.031651  7.663404
4            PECHBUSQUE     31411         443     6.577743    8.120896  3.099422
5 RAMONVILLE-SAINT-AGNE     31446          95     2.601305    8.909278  6.236784", header = T, stringsAsFactors = F
) 

ui <- fluidPage(
  leafletOutput(outputId = "mymap"),
  plotOutput(outputId = "myplot")
)

server <- function(input, output){

  ## use reactive value to store the id from observing the shape click
  rv <- reactiveVal()

  output$mymap <- renderLeaflet({
    leaflet() %>% 
      addPolygons(data = arcgis_data %>% slice(1:5), layerId = ~id) %>% 
      addProviderTiles("CartoDB.Positron")
  })

  observeEvent(input$mymap_shape_click, {
    rv(input$mymap_shape_click$id)
  })

  ## you can now plot your plot based on the id of region selected
  output$myplot <- renderPlot({
    plot_data %>%
      filter(id == rv()) %>%
      pivot_longer(cols = starts_with("Variable"), names_to = "Variable", values_to = "Value") %>%
      ggplot(aes(x = Variable, y = Value)) +
        geom_col()
  })

}

shinyApp(ui, server)

编辑:对于您上传的数据,您无需为添加单独id的数据communes相反,您可以按名称(nom_commune)进行匹配您可以改用它layerId这看起来应该可以工作。我确实删除了一些其他标签信息,因为我下载的.shp文件似乎缺少这些信息。

library(shiny)
library(leaflet)
library(rgdal)
library(sf)
library(ggplot2)
library(tidyverse)

communes <- readOGR("communes_ok.shp")

ui <- fluidPage(
  leafletOutput(outputId = "mymap"),
  plotOutput(outputId = "myplot")
)

server <- function(input, output){

  ## use reactive values to store the id from observing the shape click
  rv <- reactiveVal()

  output$mymap<-renderLeaflet(
    leaflet(communes) %>%
      addProviderTiles(providers$Stamen.TonerLite,
                       options = providerTileOptions(noWrap = TRUE)) %>%
      setView(1.50, 43.54, zoom = 12) %>%
      addTiles()  %>% 
      addPolygons(fillColor = "blue",
                  weight = 2,
                  opacity = 1,
                  color = "white",
                  dashArray = "3",
                  fillOpacity = 0.3,
                  highlight = highlightOptions(
                    weight = 5,
                    color = "#666",
                    dashArray = "",
                    fillOpacity = 0.7,
                    bringToFront = TRUE),
                  layerId = ~nm_cmmn)
  )

  observeEvent(input$mymap_shape_click, {
    rv(input$mymap_shape_click$id)
  })

  ## you can now 'output' your generated data however you want
  output$myplot <- renderPlot({
    if (is.null(rv())) return (NULL)
    plot_data %>%
      filter(nom_commune == rv()) %>%
      pivot_longer(cols = starts_with("Variable"), names_to = "Variable", values_to = "Value") %>%
      ggplot(aes(x = Variable, y = Value)) +
        geom_col()
  })

}

shinyApp(ui, server)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

单击多边形时显示信息窗口

来自分类Dev

单击多边形时,绘制多个多边形需要在infoWindow.setContent中显示建筑物名称

来自分类Dev

点击时google maps多边形,显示多边形内标记的摘要

来自分类Dev

单击时重置传单多边形上的样式

来自分类Dev

多边形未显示在gmap上

来自分类Dev

传单内多边形显示的挑战

来自分类Dev

如何显示多边形的纬度/经度?

来自分类Dev

显示从键盘插入的多边形坐标

来自分类Dev

鼠标移出时清除多边形

来自分类Dev

单击时,使用GeoXMl3在多边形的信息窗口中填充数据

来自分类Dev

Google Map API v3:单击按钮时使多边形不可编辑

来自分类Dev

单击时,使用GeoXMl3在多边形的信息窗口中填充数据

来自分类Dev

如何在鼠标单击时更改KML多边形的颜色

来自分类Dev

如何在Altair图表上绘制封闭的多边形

来自分类Dev

如何在使用Google Map API时显示多边形标题

来自分类Dev

使用 html2canvas 时,画布上未显示传单地图多边形

来自分类Dev

如何使用Google Maps API V3显示多边形和多边形

来自分类Dev

通过单击鼠标绘制多边形

来自分类Dev

D3js在多边形内单击

来自分类Dev

加载后触发单击单个geoJSON多边形

来自分类Dev

检测是在半径内还是在半径外单击多边形

来自分类Dev

D3js在多边形内单击

来自分类Dev

传单0.7:禁用鼠标单击折线或多边形

来自分类Dev

绘制后单击按钮删除多边形

来自分类Dev

圆角多边形

来自分类Dev

多边形图

来自分类Dev

滚动多边形

来自分类Dev

圆角多边形

来自分类Dev

标记多边形