R传单弹出图-在地图上添加弹出图\u标记\u单击
我想打开一个弹出窗口,在地图上为我的每个标记打开一个独特的绘图。\u标记\u使用r传单和leafpop库单击 对于用户单击的每个点,将计算要显示的绘图 下面是可复制的代码,但不会返回任何错误。R传单弹出图-在地图上添加弹出图\u标记\u单击,r,shiny,popup,r-leaflet,R,Shiny,Popup,R Leaflet,我想打开一个弹出窗口,在地图上为我的每个标记打开一个独特的绘图。\u标记\u使用r传单和leafpop库单击 对于用户单击的每个点,将计算要显示的绘图 下面是可复制的代码,但不会返回任何错误。 有什么想法吗 library(tidyverse) library(ggplot2) library(shiny) library(leaflet) library(leafpop) id <- c(1,1,1,1,2,2,3,3,3,4) lat <- c(49.823, 49.823,
有什么想法吗
library(tidyverse)
library(ggplot2)
library(shiny)
library(leaflet)
library(leafpop)
id <- c(1,1,1,1,2,2,3,3,3,4)
lat <- c(49.823, 49.823, 49.823, 49.823, 58.478, 58.478, 57.478 , 57.478 , 57.478, 38.551)
lng <- c(-10.854, -10.854, -10.854, -10.854, -11.655, -11.655, 2.021 , 2.021 , 2.021, 5.256)
type <- c("A","C","B","B","C","A","B","A","C","B")
date <- c(152.5,307.5,145,481,152,109.5,258.5,107.5,186.5,150)
start <- c(123,235,135,192,149,101,205,75,155,100)
stop <- c(182,380,155,289,155,218,312,140,218,200)
myData <- data.frame(id,type,date,start,stop,lat,lng)
chronogramme<- function(dataId){
dataFiltered<-filter(myData,id==dataId)
p<- ggplot(dataFiltered,aes(type,date))+
geom_linerange(aes(ymin=start,ymax=stop),size=5)+
coord_flip()
return(p)
}
ui <- fluidPage(
leafletOutput("map"),
plotOutput("plot")
)
server <- function(input, output, session) {
#Sortie map
output$map <- renderLeaflet({
leaflet()%>%
addProviderTiles(providers$CartoDB.Positron) %>%
addCircleMarkers(
layerId=~id,
data = myData,
lat = myData$lat,
lng = myData$lng,
radius = 5,
color = 'blue',
stroke = FALSE,
fillOpacity = 1,
group = 'markers'
)
})
observeEvent(input$map_marker_click,{
p <- chronogramme(input$map_marker_click$id)
isolate({
leafletProxy("map") %>% addPopupGraphs(list(p), group = 'markers')
})
})
}
# Create Shiny app ----
shinyApp(ui = ui, server = server)
库(tidyverse)
图书馆(GG2)
图书馆(闪亮)
图书馆(单张)
图书馆(leafpop)
id我使用地图的方法是在renderleaft
中添加圆标记后使用addPopupGraphs
(与observeEvent
检测标记上的点击相反)
在这种情况下,您可以创建绘图列表,例如:
p_all <- lapply(myData$id, chronogramme)
这样,您就不需要observeEvent
这行得通吗?谢谢您的回复,问题是我的应用程序中有很多数据,所以迭代所有绘图都不起作用
但是,我找到了另一种解决方案:将每个创建的绘图临时存储为svg,并使用addPopus()显示它们:
库(tidyverse)
图书馆(GG2)
图书馆(闪亮)
图书馆(单张)
图书馆(leafpop)
图书馆(格子)
身份证件
output$map <- renderLeaflet({
leaflet()%>%
addProviderTiles(providers$CartoDB.Positron) %>%
addCircleMarkers(
layerId=~id,
data = myData,
lat = myData$lat,
lng = myData$lng,
radius = 5,
color = 'blue',
stroke = FALSE,
fillOpacity = 1,
group = 'markers'
) %>%
addPopupGraphs(p_all, group = 'markers')
})
library(tidyverse)
library(ggplot2)
library(shiny)
library(leaflet)
library(leafpop)
library(lattice)
id <- c(1,1,1,1,2,2,3,3,3,4)
lat <- c(49.823, 49.823, 49.823, 49.823, 58.478, 58.478, 57.478 , 57.478 , 57.478, 38.551)
lng <- c(-10.854, -10.854, -10.854, -10.854, -11.655, -11.655, 2.021 , 2.021 , 2.021, 5.256)
type <- c("A","C","B","B","C","A","B","A","C","B")
date <- c(152.5,307.5,145,481,152,109.5,258.5,107.5,186.5,150)
start <- c(123,235,135,192,149,101,205,75,155,100)
stop <- c(182,380,155,289,155,218,312,140,218,200)
myData <- data.frame(id,type,date,start,stop,lat,lng)
folder <- tempfile()
dir.create(folder)
chronogramme<- function(dataId){
dataFiltered<-filter(myData,id==dataId)
p<- ggplot(dataFiltered,aes(type,date))+
geom_linerange(aes(ymin=start,ymax=stop),size=5)+
coord_flip()
return(p)
}
ui <- fluidPage(
leafletOutput("map")
)
server <- function(input, output, session) {
#Sortie map
output$map <- renderLeaflet({
leaflet()%>%
addProviderTiles(providers$CartoDB.Positron) %>%
addCircleMarkers(
layerId=~id,
data = myData,
lat = myData$lat,
lng = myData$lng,
radius = 5,
color = 'blue',
stroke = FALSE,
fillOpacity = 1
)
})
# When map is clicked, show a popup with city info
showPopup <- function(id, lat, lng) {
chrngr <- chronogramme(id)
svg(filename= paste(folder,"plot.svg", sep = "/"),
width = 500 * 0.005, height = 300 * 0.005)
print(chrngr)
dev.off()
content <- paste(readLines(paste(folder,"plot.svg",sep="/")), collapse = "")
leafletProxy("map") %>% addPopups(lng, lat, content, layerId = id)
}
observe({
leafletProxy("map") %>% clearPopups()
event <- input$map_marker_click
if (is.null(event))
return()
isolate({
showPopup(event$id, event$lat, event$lng)
})
})
}
# Create Shiny app ----
shinyApp(ui = ui, server = server)