Leaflet|在R中创建互动地图

579 阅读4分钟

Leaflet是最流行的用于创建交互式地图的JavaScript库之一。在R中,你有一个同样的包,在后台调用这个Javascript库。它使得在闪亮的应用程序中创建交互式地图变得容易。

如果你想把它放到你的演示文稿中,你也可以这样做。地图可以在RStudio的Viewer 标签中打开,也可以在网络浏览器中打开。您还可以通过使用RStudio的Export功能将地图保存为图像,并将其放入演示文稿中。

什么是交互式地图?

leaflet允许你创建具有放大、缩小、平移功能的地图,还可以将你的地理数据与地图连接起来,并通过改变下拉和辐射按钮部件的值来播放它。

**第一步:**使用命令安装leaflet R包install.packages("leaflet")

让我们从最基本的例子开始

在制作地图之前,你需要的是你想在地图上显示的地方的经度和纬度。如果你有邮政编码或邮政代码,你需要将它们转换为经纬度。你可以参考这个链接 -将邮政编码转换成经纬度

library(leaflet)
leaflet() %>%
  addTiles() %>%
  addMarkers(lng=-0.7011, lat=38.2622, popup="Sample Place")

addTiles() addMarkers() 在地图上插入瓷砖,并创建一个基本地图。在你输入的经纬度上显示标记。当你点击标记时,它显示弹出你在 参数中输入的信息。popup

绘制一些地理数据

在这一节中,我创建了一个样本数据框架,其中包括7个不同地方的信息和它们的经纬度。

df <- read.table(header = T, text = 'latitude	longitude
42.85	-2.6727
38.3452	-0.4815
38.161	-0.8013
38.1631	-0.8115
38.1673	-0.8034
38.1776	-0.7973
37.9787	-0.6822
')

你可以在leaflet() 函数中定义数据框架的名称(如下图所示)。这里支持Tilde~来提及数据框架的列名。

leaflet(df) %>%
  addTiles() %>%
  addMarkers(lng= ~longitude, lat=~latitude, 
             popup = ~paste(latitude, longitude, sep = '<br/>'))  

<br/> 是一个html代码,用于在弹出的信息中创建一个新行。这里经度被输入到新的一行中。你可以通过使用**paste()**函数串联在弹出窗口中显示任何信息。

你可以通过使用参数popupOptions ,在弹出框中禁用关闭按钮。

leaflet(df) %>%
  addTiles() %>%
  addMarkers(lng= ~longitude, lat=~latitude, 
             popup = ~paste(latitude, longitude, sep = '<br/>'),
             

如何在弹出信息中加入额外的列?

假设你是房地产公司的分析员,被要求在地图上按房产类型显示你的组织在不同地点拥有的房产数量。为了证明这个例子,让我们创建一个假的数据框架,按资产类型计算房产数量。

df2 <- read.table(header = T, text = '
latitude	longitude	Flat	Land	Office
42.85	-2.6727	5	22	25
38.3452	-0.4815	2	24	25
38.161	-0.8013	5	17	11
38.1631	-0.8115	5	22	24
38.1673	-0.8034	5	15	13
38.1776	-0.7973	5	21	16
37.9787	-0.6822	2	11	16
38.2622	-0.7011	61	24	16
39.9333	-0.1	0	14	13
38.0848	-0.944	0	21	21
38.125	-0.8782	3	18	14
38.1339	-0.8624	3	12	15
38.1518	-0.8308	3	21	20
38.6253	-0.5722	3	14	14
')

leaflet(df2) %>%
  addTiles() %>%
  addMarkers(lat = ~latitude, lng = ~longitude, 
             clusterOptions = markerClusterOptions(zoomToBoundsOnClick = T), 
             popup = ~paste(
               paste('<b>', 'Flat:', '</b>', Flat), 
               paste('<b>',  'Land:', '</b>', Land),
               paste('<b>', 'Office:', Office),
               sep = '<br/>'),
             popupOptions = popupOptions(closeButton = FALSE)
             )

你是否观察到在上面的地图上有一些位置相近的地方的分组?

当你在地图上有大量的标记时,这是很有用的,所以通过使用下面的命令对它们进行分组是很有用的。
clusterOptions = markerClusterOptions(zoomToBoundsOnClick = T)

如何在传单中添加自定义图标?

如果你厌倦了在地图上显示位置的默认图标,你应该很高兴地知道,在小册子里有一个名为icon = list( ) 的选项,可以在地图上显示你希望的图标。

leaflet(df2) %>%
  addTiles() %>%
  addMarkers(lat = ~latitude, lng = ~longitude, 
             icon = list(
               iconUrl = 'https://colepowered.com/wordpress/wp-content/uploads/2014/10/29102014-8.png',
               iconSize = c(75, 75))
  )
  

如何在传单地图上添加条形/饼形图?

要在传单地图中加入图表,您可以使用leaflet.minicharts 包。它与传单包一起工作。它支持各种参数来定制图表的颜色和图例的位置。

library(leaflet.minicharts)
library(dplyr)

chartdf <-  df2 %>% select(Flat, Land, Office)
colors  <-  c("#4c34eb", "#eb9934", "#eb3434")

leaflet() %>% addTiles() %>% 
  addMinicharts(df2$longitude,
                df2$latitude,
                type = "bar", 
                chartdata = chartdf, 
                colorPalette = colors, 
                legend = TRUE, 
                legendPosition = "topright",
                width = 45, height = 45)

以下是该软件包支持的图表类型。

  • 条形图的 "条"。
  • 饼状图的 "饼"。
  • 极地面积图的 "极地-面积 "和 "极地-半径"。

如何在小册子地图上显示实时天气?

要在地图上显示实时天气,您需要在Open Weather Map注册并创建一个账户。一旦创建,您将通过电子邮件收到API密钥,它将在接下来的几个小时内被激活。API密钥需要在下面的程序中输入(用黑体字突出)。

leaflet() %>%
  addProviderTiles(providers$CartoDB.Positron) %>%
  addMarkers(lat = ~latitude, lng = ~longitude) %>% 
  addProviderTiles(providers$OpenWeatherMap.Wind,  
                   options=providerTileOptions(apiKey="

如何在shiny应用程序中显示传单地图?

一般来说,互动地图是在shiny应用程序中显示的。如果你不熟悉shiny应用程序,你应该探索它,因为它是建立一个网络应用程序或在线仪表板的最简单的方法之一,免费。它不需要Javascript、CSS和HTML等网络编程语言的知识。

  • 在shiny应用程序的用户界面部分,你需要使用leafletOutput() 函数来包含小册子。
  • 在服务器端,你可以将你的代码包在renderLeaflet({ ... })
library(shiny)
library(leaflet)

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

server <- function(input, output, session) {
  
  output$map1 <- renderLeaflet({
    leaflet(df2) %>%
      addTiles() %>%
      addMarkers(lat = ~latitude, lng = ~longitude)  
    })
  
}

shinyApp(ui, server)

有很多时候,你需要实时修改地图。为了完成这个任务,你可以使用leafletProxy() 函数,而不是leaflet()