You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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" = "元朗"
      )
    )
  )
)

问题分析与修正

空白的核心原因有两个:

  1. 地图未正确注册:echarty需要先通过ec.registerMap()将GeoJSON数据注册为指定地图名称,而非直接在series中传入geoJSON参数。
  2. 数据名称不匹配: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 12:57:03