• R语言软件
  • 文章推荐:echarts4r: 从入门到应用【袁凡】

@yuanfan 想在地图上的某个坐标点上添加一段文字描述要怎么实现呢?

这是根据 R 内置的数据集 quakes 绘制的散点图

library(echarts4r)
quakes |>
  e_charts(x = long) |>
  e_geo(
    roam = TRUE,
    map = "world",
    boundingCoords = list(
      c(165.67, -38.59),
      c(188.13, -10.72)
    )
  ) |>
  e_scatter(
    serie = lat, 
    scale = NULL, 
    size = mag, name = "地震点",
    coord_system = "geo"
  )

想在图上某个点旁边注上说明,这个点不在数据集 quakes 内,刚 Google 了一下,这次汤加火山爆发地点貌似是 c(-21.0744343,-176.2500947),这种有办法实现吗?

    Cloud2016
    我没琢磨出来比较好的,只是给那个点增加了提示,需要把鼠标放到那个点上才可以看到提示的内容:

    library(echarts4r)
    data("quakes")
    row <- c(-21.0744343, -176.2500947, 500, 5, 50)
    quakes <- rbind(quakes, row) #把这个点加到数据集里面
    
    quakes$label <- ' '
    quakes[which(quakes$lat == -21.0744343 &
                   quakes$long == -176.2500947), ]$label <- '某个点旁边注上的说明'
    
    quakes |>
      e_charts(x = long) |>
      e_geo(roam = TRUE,
            map = "world",
            boundingCoords = list(c(165.67,-38.59),
                                  c(188.13,-10.72))) |>
      e_scatter(
        serie = lat,
        scale = NULL,
        size = mag,
        bind = label, #params.name
        name = "地震点",
        coord_system = "geo"
      )|>
      e_tooltip(
        padding = 5,
        borderWidth = 1,
        trigger = "item",
        formatter = htmlwidgets::JS("function(params){
            return( params.name )}")
      )

    那个,我想吐槽下你给的那个点的坐标位置也太特殊了,我刚开始把地图缩小了没找到,还是加了数据标签的引导线才顺着线找到的。

    看其他小伙伴们有没有什么好的思路。

    Cloud2016
    不用 tooltip,改成增加 label 也行,如下:

    quakes |>
      e_charts(x = long) |>
      e_geo(roam = TRUE,
            map = "world",
            boundingCoords = list(c(165.67,-38.59),
                                  c(188.13,-10.72))) |>
      e_scatter(
        serie = lat,
        scale = NULL,
        size = mag,
        bind = label, #params.name
        name = "地震点",
        coord_system = "geo"
      )|>
      e_labels(
        position = 'top',
        formatter = htmlwidgets::JS("function(params){
            return( params.name )}")
      )

      yuanfan 这个事看起来还挺复杂的,理想态是类似 ggplot2 的标签图层,或者 ggrepel 那样,可以另起一个数据,添加文本注释图层。

      set.seed(2020)
      library(ggplot2)
      library(ggrepel)
      dat <- data.frame(
        x = seq(100),
        y = cumsum(rnorm(100))
      )
      anno_data <- dat |> 
        subset(x %% 25 == 10)  |> 
        transform(text = "text")
      
      ggplot(data = dat, aes(x, y)) +
        geom_line() +
        geom_label_repel(aes(label = text), # 有另一份数据,新加一个图层
          data = anno_data,
          direction = "y",
          nudge_y = c(-5, 5, 5, 5)
        ) +
        theme_minimal()

      P.S. 汤加火山位置我应该给 c(-21.0744, 183.7499) 毕竟西经 176 就是东经 184, 这样就和 quakes 数据集保持一样了。

      # 从本地加载新的正确的中国地图数据
      > china_map <- jsonlite::read_json("中华人民共和国.json")
      > china_map <- jsonlite::read_json("https://geo.datav.aliyun.com/areas_v3/bound/100000_full.json")
      > # 开始绘图
      > df |>
      +     e_charts(region) |>
      +     # 注册地图
      +     e_map_register("China2", china_map) |>
      +     # 调用注册的地图
      +     em_map("China2") |>
      +     # 将数据映射到地图上
      +     e_map(value, map = "China2") |>
      +     e_visual_map(value)
      Error in readBin(3L, raw(0), 32768L) : 
        can only read from a binary connection

        lxg 没有复现你的问题,需要提供更多关于运行环境的信息,请贴出

        xfun::session_info(c('blogdown', 'rmarkdown', 'echarts4r', 'jsonlite'))

        的运行结果

        文章很好,不过我有一个问题:中国地图关于九段线及南海诸岛放置的问题。一般在画中国地图的时候往往会把九段线和南海诸岛绘制一张缩略图放在右下角,但是用高德地图数据的时候,不能直接做到这一点,不知道有没有其他方法?

          curiosity 我们也找了,没找到这样的开放的可供免费下载的来自权威官方网站的矢量地图数据。阿里、百度等大厂内部的、对外的数据可视化和 BI 工具产品里面有,以订阅收费的服务方式在公有或私有云上部署。

            Cloud2016 有一个粗略的想法,因为九段线和南海诸岛的缩略图实际上可以看成另一张图。那么大图去掉九段线的坐标,画一张图,然后加上九段线等再单独作图,然后截取合适的部分,再将两张图片叠加在一起。

              2 个月 后
              6 天 后
              7 天 后
              1 个月 后

              请问echarts4r自带的图片下载功能,可以设置高分辨率的下载吗?

              9 个月 后

              啊,隔了一年多再看这篇文章,真得好多细节都不完善呐。

              在第3.5.5小节中调用的“China2”地图,其实是在3.5.2节中通过 e_map_register 函数注册好的,所以后面直接用了。如果第3.5.5小节独立写的话,应如下:

              library(echarts4r)
              
              china_map <- jsonlite::read_json("https://geo.datav.aliyun.com/areas_v3/bound/100000_full.json")
              
              df <- data.frame(
                lat = c(39.9109, 31.2359, 22.5484),
                lon = c(116.4133, 121.4805, 114.0645),
                city = c("北京",  "上海", "深圳"),
                value = c(10, 20, 30)
              )
              
              df |>
                  e_charts(lon) |>
                  e_map_register("China2", china_map) |>
                  e_geo(map = "China2") |>
                  e_scatter(lat, value, coord_system = "geo", scale = NULL)
              2 年 后

              又是我的网速问题么?怎么很多图都看不到了。

                Claireasstronaut

                哇,你做得好好啊。这就是我一直以来想做的事啊(PS想把收集过的数据从各篇分散的博客统一整理到一个 shiny 入口,分类展示),不知道你会不会写一篇文章讲讲这是怎么做的?投搞到 COS 的话对我们这些想学 shiny 但不会的菜鸟会有很大帮助的。