如何用R语言echarty包创建交互式香港人口密度地图
解决echarty包绘制香港人口密度地图空白问题
问题描述
尝试用R的echarty包复刻ECharts的「2011年香港人口密度」交互式地图,编写的代码无报错但界面空白,无法显示地图。同时用echarts4r包可成功生成地图,但绘制速度极慢,希望解决echarty的地图显示问题。
原echarty代码(空白问题版本)
library(echarty) library(jsonlite) geojson <- read_json("https://echarts.apache.org/examples/data/asset/geo/HK.json") ec.init( title = list( text = "Population Density of Hong Kong (2011)", subtext = "Data from Wikipedia", sublink = "http://zh.wikipedia.org/wiki/%E9%A6%99%E6%B8%AF%E8%A1%8C%E6%94%BF%E5%8D%80%E5%8A%83#cite_note-12" ), tooltip = list( trigger = "item", formatter = "{b}<br/>{c} (p / km²)" ), toolbox = list( show = TRUE, orient = "vertical", left = "right", top = "center", feature = list( dataView = list(readOnly = FALSE), restore = list(), saveAsImage = list() ) ), visualMap = list( min = 800, max = 50000, text = c("High", "Low"), realtime = FALSE, calculable = TRUE, inRange = list(color = c("lightskyblue", "yellow", "orangered")) ), series = list( list( name = "香港18区人口密度", type = "map", map = "HK", geoJSON = geojson, label = list(show = TRUE), data = list( list(name = "中西区", value = 20057.34), list(name = "湾仔", value = 15477.48), list(name = "东区", value = 31686.1), list(name = "南区", value = 6992.6), list(name = "油尖旺", value = 44045.49), list(name = "深水埗", value = 40689.64), list(name = "九龙城", value = 37659.78), list(name = "黄大仙", value = 45180.97), list(name = "观塘", value = 55204.26), list(name = "葵青", value = 21900.9), list(name = "荃湾", value = 4918.26), list(name = "屯门", value = 5881.84), list(name = "元朗", value = 4178.01), list(name = "北区", value = 2227.92), list(name = "大埔", value = 2180.98), list(name = "沙田", value = 9172.94), list(name = "西贡", value = 3368), list(name = "离岛", value = 806.98) ), nameMap = list( "Central and Western" = "中西区", "Eastern" = "东区", "Islands" = "离岛", "Kowloon City" = "九龙城", "Kwai Tsing" = "葵青", "Kwun Tong" = "观塘", "North" = "北区", "Sai Kung" = "西贡", "Sha Tin" = "沙田", "Sham Shui Po" = "深水埗", "Southern" = "南区", "Tai Po" = "大埔", "Tsuen Wan" = "荃湾", "Tuen Mun" = "屯门", "Wan Chai" = "湾仔", "Wong Tai Sin" = "黄大仙", "Yau Tsim Mong" = "油尖旺", "Yuen Long" = "元朗" ) ) ) )
问题分析与修正
空白的核心原因有两个:
- 地图未正确注册:echarty需要先通过
ec.registerMap()将GeoJSON数据注册为指定地图名称,而非直接在series中传入geoJSON参数。 - 数据名称不匹配:GeoJSON中的区域名称为英文,但代码中data使用了中文名称,导致无法匹配渲染。
修正后的echarty代码
library(echarty) library(jsonlite) # 读取GeoJSON并注册HK地图 geojson <- read_json("https://echarts.apache.org/examples/data/asset/geo/HK.json") ec.registerMap("HK", geojson) ec.init( title = list( text = "Population Density of Hong Kong (2011)", subtext = "Data from Wikipedia", sublink = "http://zh.wikipedia.org/wiki/%E9%A6%99%E6%B8%AF%E8%A1%8C%E6%94%BF%E5%8D%80%E5%8A%83#cite_note-12" ), tooltip = list( trigger = "item", formatter = "{b}<br/>{c} (p / km²)" ), toolbox = list( show = TRUE, orient = "vertical", left = "right", top = "center", feature = list( dataView = list(readOnly = FALSE), restore = list(), saveAsImage = list() ) ), visualMap = list( min = 800, max = 50000, text = c("High", "Low"), realtime = FALSE, calculable = TRUE, inRange = list(color = c("lightskyblue", "yellow", "orangered")) ), series = list( list( name = "香港18区人口密度", type = "map", map = "HK", # 使用已注册的地图名称 label = list(show = TRUE), data = list( list(name = "Central and Western", value = 20057.34), list(name = "Wan Chai", value = 15477.48), list(name = "Eastern", value = 31686.1), list(name = "Southern", value = 6992.6), list(name = "Yau Tsim Mong", value = 44045.49), list(name = "Sham Shui Po", value = 40689.64), list(name = "Kowloon City", value = 37659.78), list(name = "Wong Tai Sin", value = 45180.97), list(name = "Kwun Tong", value = 55204.26), list(name = "Kwai Tsing", value = 21900.9), list(name = "Tsuen Wan", value = 4918.26), list(name = "Tuen Mun", value = 5881.84), list(name = "Yuen Long", value = 4178.01), list(name = "North", value = 2227.92), list(name = "Tai Po", value = 2180.98), list(name = "Sha Tin", value = 9172.94), list(name = "Sai Kung", value = 3368), list(name = "Islands", value = 806.98) ), nameMap = list( "Central and Western" = "中西区", "Eastern" = "东区", "Islands" = "离岛", "Kowloon City" = "九龙城", "Kwai Tsing" = "葵青", "Kwun Tong" = "观塘", "North" = "北区", "Sai Kung" = "西贡", "Sha Tin" = "沙田", "Sham Shui Po" = "深水埗", "Southern" = "南区", "Tai Po" = "大埔", "Tsuen Wan" = "荃湾", "Tuen Mun" = "屯门", "Wan Chai" = "湾仔", "Wong Tai Sin" = "黄大仙", "Yau Tsim Mong" = "油尖旺", "Yuen Long" = "元朗" ) ) ) )
修改说明
- 新增
ec.registerMap("HK", geojson):将GeoJSON数据注册为名为"HK"的地图,供series调用。 - 修改data中的name为英文:与GeoJSON中的区域名称保持一致,确保数据与地图区域正确匹配。
- 移除series中的
geoJSON参数:改为使用已注册的"HK"地图。
关于echarts4r绘制缓慢的说明
echarts4r绘制缓慢通常与GeoJSON解析、渲染效率有关,可尝试以下优化:
- 将GeoJSON文件本地保存后读取,减少网络请求耗时。
- 简化GeoJSON的几何精度(使用工具去除冗余坐标点),降低渲染负载。
内容的提问来源于stack exchange,提问作者LIANG Chen
相关产品推荐
相关产品推荐

