使用Leaflet库在弹出窗口中绘制柱状图。

10

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

条形图代码(可能会有问题,因为我正在使用 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

这将在所需位置打印图表,但弹出窗口却显示了一个网页,只有我自己能够打开。

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

希望有人能够帮忙。


请提供样例数据。 - vck
我的选择语句是:SELECT distinct region + ', ' + city as Location, count(country) as [CountVis] FROM DATABASE WHERE Country = 'Switzerland' GROUP BY country, region, city. 数据为:位置- 日内瓦,苏黎世;CountVis- 1,15(这是我用来绘制条形图的数据)。 - Faiz Saiyed
2个回答

12
也许有点晚,但这里有一个解决方案。在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),它能够从 latticeggplot2 绘图中生成交互式 SVG 绘图。

更新:

library(mapview) 现在具有专门的功能:

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

这仅在mapview的开发版本中可用,可通过以下方式安装:

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”))无法正常工作。我想在表格上方添加一张图片。 - MLavoie
不,目前 mapview 中没有任何可用的函数可以实现这个功能。但我认为这是可能的。基本上,需要将 popup* 函数中的两个 HTML 字符串组合起来。 - TimSalabim
1
@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) ` - TimSalabim
我尝试使用mapview::popupGraph,但是得到的结果显示它已经被弃用了。而且leaflet没有popupGraph。 - paolov
上面提供的第一个示例会导致 R 崩溃。它在绘图窗口中显示一段时间,看起来可能正在工作,但 CPU 开始有点强度,几秒钟后 R 就会关闭。 - paolov

3
这可能有点晚了,但这是一个完整的leaflet实现。我首先创建绘图,然后使用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 <- 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) - Bryan Butler
当我运行lapply命令时,出现以下错误信息:Error in update.default(p[[i]], col = clr) : need an object with call component。有任何想法是为什么吗? - Ben
@Ben 你需要确保已经安装了sp、lattice和map view库。 - Bryan Butler
我尝试使用mapview :: popupGraph,但是结果显示它已经被弃用。而且leaflet没有popupGraph函数。 - paolov
这是一个警告,但你需要阅读它。该警告指示使用'leafpop::popupGraph,因此您需要安装leafpop包。 - Bryan Butler

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接