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

时间:2020-02-18 13:22:24

标签: r shiny data-visualization shinyapps

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

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

我已经创建了包含多边形的地图,并且在点击(have a look on here)时设法显示了一些基本信息,但是我不知道如何在每个地图的下方添加一个地标(例如)我单击多边形。

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

非常感谢!

罗曼

我的代码:

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
> 

1 个答案:

答案 0 :(得分:0)

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

我将创建一个reactiveVal来存储单击的多边形区域的id(此变量存储input$mymap_shape_click$id)。您在addPolygons中使用的数据应有id可供引用。

在绘图中(或在单独的reactive表达式中),您可以基于包含reactiveVal的{​​{1}}过滤数据。

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中使用它。这看起来应该可以工作。我确实删除了一些其他标签信息,因为我下载的.shp文件中似乎缺少这些信息。

layerId
相关问题