【问题标题】:plotting barchart in popup using leaflet library使用传单库在弹出窗口中绘制条形图
【发布时间】:2015-09-02 11:58:08
【问题描述】:

快速提问。 我在 sql server 中有一些数据已加载到 RStudio 中。我已经为数据制作了一个条形图,现在我正在使用传单库并使用纬度和经度在地图上绘制一个点。当用户单击该点时,我希望能够使用弹出窗口在其中显示条形图。

条形图代码(可能这是一个问题,因为我正在使用 googleVis 库,所以不确定我是否可以在弹出窗口中使用它。但这是我可以制作和需要的最合适的条形图 - 其他建议可能会有所帮助我还不是 R 库的专业人士)

Switzerland <- sqlQuery(con, "sql query")
SwitzerlandChart <- gvisBarChart(Switzerland, options = list(height=200))

对于图表的代码是:

m <- leaflet() %>%
  addTiles() %>%  # Add default OpenStreetMap map tiles
  addCircles(lng=8.498868, lat=46.9221, popup=paste(plot(SwitzerlandChart)))

当我运行此代码时,它会打开一个网页来查看我的条形图。 然后我运行以下命令:

m #Prints the graph

这会在所需位置打印带有点的图形,但弹出窗口会显示一个网页,而不是只有我可以打开。

我希望能够在弹出窗口中绘制条形图。

希望有人能帮忙

【问题讨论】:

  • 请提供样本数据。
  • 我的选择语句是:SELECT distinct region + ', ' + city as Location, count(country) as [CountVis] FROM DATABASE WHERE Country = 'Switzerland' GROUP BY country, region, city。数据为:地点——日内瓦、苏黎世; CountVis- 1, 15(这是我绘制条形图的内容。

标签: r leaflet rstudio googlevis


【解决方案1】:

可能有点晚了,但这里有一个解决方案。 library(leaflet) 中的 addPopups() 函数似乎能够处理 .svg 文件。因此,您可以简单地使用svg() 保存您的绘图,然后使用readLines() 再次读取它。这是一个使用 library(mapview) 的可重现示例:

library(lattice)
library(mapview)
library(sp)

data(meuse)
coordinates(meuse) <- ~x+y
proj4string(meuse) <- CRS("+init=epsg:28992")

clr <- rep("grey", length(meuse))

fldr <- tempfile()
dir.create(fldr)

pop <- lapply(seq(length(meuse)), function(i) {

  clr[i] <- "red"
  p <- xyplot(meuse$cadmium ~ meuse$copper, 
              col = clr, pch = 20, alpha = 0.7)

  svg(filename = paste(fldr, "test.svg", sep = "/"), 
      width = 250 * 0.01334, height = 250 * 0.01334)
  print(p)
  dev.off()

  tst <- paste(readLines(paste(fldr, "test.svg", sep = "/")), collapse = "")

  return(tst)

})

mapview(meuse, popup = pop, cex = "cadmium")

您会看到每个弹出窗口都是一个散点图。至于leaflet 的例子,请考虑:

content <- pop[[1]]
leaflet() %>% addTiles() %>%
  addPopups(-122.327298, 47.597131, content,
            options = popupOptions(closeButton = FALSE)
  )

如果您需要交互式绘图,您可以查看library(gridSVG),它能够生成交互式 svg 绘图,例如latticeggplot2 地块。

更新:

library(mapview) 现在为此指定了功能:

  • popupGraph:嵌入 latticeggplot2 或基于交互式 hatmlwidgets 的绘图。
  • popupImage:嵌入本地或远程(网络)图像

这目前仅在 ma​​pview 的开发版本中可用,可以安装:

devtools::install_github("environmentalinformatics-marburg/mapview", ref = "develop"

【讨论】:

  • 是否可以结合popupGraph和popupTable?例如:mapview(meuse, popup = popupGraph(p, type = "svg", width = 3, height = 2.5), popup = popupTable(meuse, z="cadmium")) 不起作用。我想在表格上方添加一张图片。
  • 不,这对于 mapview 中当前可用的任何功能都是不可能的。我认为这是可能的。基本上,需要将 popup* 函数中的两个 html 字符串组合起来。
  • @MLavoie 原来你可以把它们粘贴在一起library(mapview) library(lattice) poptab = popupTable(breweries[1, ]) popgrph = popupGraph(graphs = lattice::xyplot(1:10 ~ 10:1)) tst = paste(popgrph[[1]], poptab[[1]]) mapview(breweries[1, ], popup = tst)
  • 我尝试使用 mapview::popupGraph,但得到的结果是它现在已被弃用。而且传单没有popupGraph
  • 上面提供的第一个示例导致 R 崩溃。它在绘图窗口中显示了一段时间,看起来它可能正在工作,但 CPU 会有点强度,几秒钟后 R 关闭
【解决方案2】:

这可能也有点晚了,但这里有一个完整的传单实现。我首先创建了绘图,然后使用 popupGraph 函数将其添加进去。

# make a plot of the two columns in the dataset
p <- xyplot(Home ~ Auto, data = Jun, col = "orange", pch = 20, cex = 2)

# make one for each data point
p <- mget(rep("p", length(Jun)))

# color code it so that the corresponding points are dark green
clr <- rep("orange", length(Jun))
p <- lapply(1:length(p), function(i) {
  clr[i] <- "dark green"
  update(p[[i]], col = clr)
})


# now make the leaflet map
m1 <- leaflet() %>%
  addTiles() %>%
  setView(lng = -72, lat = 41, zoom = 8) %>%


  # add the markers for the Jun dataset
  # use the popupGraph function
  addCircleMarkers(data = Jun, lat = ~Lat, lng = ~Lon,
                   color = ~beatCol(BeatHomeLvl), popup = popupGraph(p),
                   radius = ~sqrt(BeatHome*50), group = 'Home - Jun') %>%


  # layer control
  addLayersControl(
    overlayGroups = c('Home - Jun'
    ),
    options = layersControlOptions(collapsed = F)
  ) %>%



  # legend for compare to average

  addLegend('bottomright', pal = beatCol, values = last$BeatTotalLvl,
            title = 'Compare<br>Quote Count to<br>3Mos State Avg',
            opacity = 1)

m1

这是输出。

【讨论】:

  • 您也可以在 ggplot 中制作绘图并添加它们:p &lt;- ggplot(Jun, aes(x = Auto, y = Home)) + geom_point(col = "orange", pch = 20, cex = 2) + geom_smooth(method = 'lm', formula = y~x) + xlim(0,1500)
  • 当我运行lapply 命令时,我得到: update.default(p[[i]], col = clr) 中的错误:需要一个带有调用组件的对象有什么想法吗?跨度>
  • @Ben,您需要确保已安装 sp、lattice 和地图视图库。
  • 我尝试使用 mapview::popupGraph,结果显示它现在已被弃用。而且传单没有popupGraph
  • 这是一个警告,但您需要阅读它。警告指示使用'leafpop::popupGraph,因此您需要安装leafpop 包。
猜你喜欢
  • 2019-09-05
  • 2020-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-02
  • 1970-01-01
  • 1970-01-01
  • 2023-02-14
相关资源
最近更新 更多