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

大家好,不知道有没有人有兴趣学完入门内容后,填补一下从入门到实战的 Gap。比如苏玮 @InfinityLoop 开发的新型冠状病毒疫情速报 里包含的地图要复杂得多,数据也有故事背景。希望有一篇有故事、有数据、有技术、有观点的文章。

@yuanfan 有没有兴趣再来一篇? 🤣

    Cloud2016
    好啊,由于编辑大人非常靠谱,我倒是愿意写,不过一下子想不到可以写什么,而且也不知道上哪可以找到真实数据。对了,你另一篇帖子里面关于空间地理可视化的文章里用的数据是从哪找的?

      yuanfan R 及 R 包内置的数据集就有很多,比如美国人口普查统计数据是 R 内置的数据集 state.x77,不过需要进一步挖一挖,美国也有人口普查以及发布数据的官网,有人封装了一些数据接口,比如 tidycensus,还有人进一步做了些可视化Creating beautiful demographic maps in R with the tidycensus and tmap packages

      加州大学尔湾分校整理机器学习数据仓库
      UC Irvine Machine Learning Repository
      https://archive-beta.ics.uci.edu/

      英国数百个空气污染质量检测站的数据
      https://github.com/davidcarslaw/openair

      国际房价和繁荣数据
      https://github.com/kvasilopoulos/ihpdr

      做一些技术学习和数据分析,网络上有很多数据,比如这个公开数据列表

      https://github.com/awesomedata/awesome-public-datasets

      应该能找到和专业、工作或者感兴趣的领域数据。对了,还有 Kaggle 也是一个很大的数据源
      https://www.kaggle.com/

        @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自带的图片下载功能,可以设置高分辨率的下载吗?