在R/leaflet中创建动态图例及Font Awesome图标使用问题
问题解答
一、基于颜色列创建动态图例
完全可以实现动态图例,核心思路是先提取数据中唯一的颜色类别,再为每个类别匹配对应的图标样式,最后通过addLegend添加动态生成的图例。修改后的代码如下:
library(leaflet) library(dplyr) Items <- structure(list(name = c("batteries", "bracelet", "jar", "coffee ", "magazine", "book"), color = c("red", "green", "orange", "green", "orange", "orange"), lat = c(41.61238, 46.18012, 45.73361, -51.35723, -5.25024, 16.54793), long = c(-153.0564, 153.0042, -82.22083, 71.63157, -53.44893, 48.57037)), class = "data.frame", row.names = c(NA, -6L)) # 提取唯一颜色类别 unique_colors <- unique(Items$color) # 为每个颜色创建对应的图标样式 icon_list <- lapply(unique_colors, function(col) { awesomeIcons( icon = "fa-dollar", lib = 'fa', iconColor = "black", markerColor = col ) }) names(icon_list) <- unique_colors Items %>% leaflet() %>% addProviderTiles("Esri.WorldTopoMap") %>% # 添加标记(按颜色匹配图标) addAwesomeMarkers( lng = ~long, lat = ~lat, icon = ~icon_list[color][[1]], label = ~color ) %>% # 添加动态图例 addLegend( position = "bottomright", colors = unique_colors, labels = unique_colors, # 匹配图例图标样式 icons = lapply(unique_colors, function(col) { awesomeIconList( col = awesomeIcons( icon = "fa-dollar", lib = 'fa', iconColor = "black", markerColor = col ) )[[1]] }) )
这段代码会自动识别Items$color中的所有唯一类别(红、绿、橙),并在图例中显示对应颜色的标记图标和文字。
二、Font Awesome图标"hand-holding-dollar"无效的解决方法
你遇到的问题是因为leaflet默认的awesomeIcons使用的是Font Awesome 4.x版本,而"hand-holding-dollar"是Font Awesome 5+才新增的图标。解决方式有两种:
方法1:使用Font Awesome 5版本的图标库
修改awesomeIcons的lib参数为'fa5',即可调用对应版本的图标:
icons <- awesomeIcons( icon = "hand-holding-dollar", lib = 'fa5', # 指定使用Font Awesome 5 iconColor = "black", markerColor = Items$color )
方法2:手动引入最新Font Awesome CDN
如果需要使用Font Awesome 6的图标,可以在leaflet地图中添加自定义HTML依赖,引入官方CDN资源:
library(htmltools) # 引入Font Awesome 6 CDN fa_cdn <- tags$head( tags$link(rel = "stylesheet", href = "https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css") ) Items %>% leaflet() %>% addProviderTiles("Esri.WorldTopoMap") %>% # 添加CDN依赖 addControl(html = fa_cdn, position = "topleft") %>% addAwesomeMarkers( lng = ~long, lat = ~lat, icon = awesomeIcons( icon = "hand-holding-dollar", lib = 'fa', iconColor = "black", markerColor = Items$color ), label = ~color )
注意:使用方法2时需确保网络能访问CDN资源,也可下载Font Awesome本地文件替代CDN链接。
内容的提问来源于stack exchange,提问作者Raul
相关产品推荐
相关产品推荐

