在Shiny中使用Echarts

  刚刚写好了《用R markdown生成仪表板》这篇文章,觉得flexdashboard包提供的组件还不够丰富,虽然还有不少htmlwidget可以引用,还是若有所缺。搜了一下,找到了这篇文章,介绍了一些不错的 JavaScript 框架或类库可以用来生成仪表板,Apache Echarts中文文档示例)我是知道的,非常有名和流行。然后找到了echarts4r这个包,为Echarts库提供了非常易用的R语言接口,最重要的是,在Shiny中它可以用统一的一个函数renderEcharts4r()把各种各样的所有的Echarts JS图都渲染输出了,然后在R语言中用管道操作符一个一个步骤的画图,像ggplot2一样简单易用,然后在Shiny服务器端与浏览器JS之间还提供了双向的数据更新通道:服务器端可以通过Shiny的反应机制获知浏览器端的操作,比如选择了图上的那些数据点,也可以通过Shiny代理函数发送数据到浏览器JS,动态更新Echarts,简直是酷毙了。
  浏览echarts4r主页及文档,可视化组件应有尽有,太强大了,简直是发现了新大陆。概括的说,echarts4r在JS Echarts与R语言Shiny之间建立了简单易用的桥梁。Shiny反应式编程中的反应式交互是在浏览器与服务器前后端之间的,Echarts、plotly之类的JS库,它们的反应机制是在浏览器前端人机之间的,二者组合在一起,为基于浏览器的网络应用提供了全面的交互能力。
  继续用上篇文章的下载流量监控例子,先上一个酷一点的流量表感性认识一下,体验地址

增加了一页“echarts4r测试,显示一个定制的流量表。”
调整流量提醒的阀值,改变流量表的颜色。

  仪表板中新增一页的R markdown代码如下:

echarts4r测试
=======================================================================

### 下载数/秒 (过去 5 分钟) 

`\``{r}
# 拷贝代码时记得把上面反引号中的反斜杠去掉。
# downloadRate is a reactive expression that computes the download
# rate during this dashboard's lifetime.
startTime <- as.numeric(Sys.time())
downloadRate <- reactive({
  elapsed <- as.numeric(Sys.time()) - startTime
  nrow(pkgData()) / min(maxAgeSecs, elapsed)
})

# install.packages("echarts4r")
library(echarts4r)

# Emit the download rate
renderEcharts4r({
  rate <- formatC(downloadRate(), digits = 1, format = "f")
  color<- if (rate >= input$rateThreshold) "Orange" else "Green"
  e_charts() |> 
  e_gauge(round(downloadRate(),1), "次/秒", min=0, max=120, animation=FALSE,
          progress = list(show=TRUE, width=18), itemStyle=list(color=color)) 
})
`\``

  参阅Apache Echarts中文文档仪表盘示例(那里有各种各样Echarts可视化组件的示例),上述仪表盘示例样式的源码可知,Echarts JS组件样式的设置,是由json格式的参数控制,如下图所示:

上面样式仪表盘的JS源码

  参阅echarts4r开始文档的例子,可知JS json格式的参数在R语言中,名称一致,格式为list,这样,根据上面的各种Echarts的在线示例,我们就可以知道它们的各种参数,然后在Shiny的renderEcharts4r()函数内赋值,从而玩转Echarts了。
  具体看看echarts4r开始文档中的例子:

# prepare data
df <- state.x77 |> 
  as.data.frame() |> 
  tibble::rownames_to_column("State")

library(echarts4r) # load echarts4r

df |> 
  e_charts(State) |> # initialise and set x
  e_line(Population, smooth = TRUE) |>  # add a line
  e_area(Income, smooth = TRUE) |>  # add area
  # 非json格式的参数,直接按名称传递
  e_x_axis(name = "States") |>  # add x axis name
  e_title("US States", "Population & Income") |>  # Add title & subtitle
  e_theme("infographic") |>  # theme
  e_legend(right = 0) |> # move legend to the bottom
  e_tooltip(
    # Echarts中json格式的参数,在R语言中用列表来表示。
    axisPointer = list(
      type = "cross"
    )
  ) 

  先准备一个用于作图的data frame,通过管道操作符“|>”传给echarts4r的作图函数,通过管道逐步传给下一步的作图函数,像ggplot2一样每一步设定图形的一项要素,通过list传入json参数定制,就是这么简单。
  运行结果如下图:


在R语言中通过列表去设置Echarts的json参数

  最后浏览一下Echarts包罗万有的图形组件,Echarts里有几十种图形(看左边的目录列表),每种图形又有很多种不同的样式,应有尽有:


折线图就有几十种样式

仪表盘也有十几种样式

还有各种3D图等

  现在,可以把这些漂亮的图形组件,用flexdashboard包放入R markdown仪表板中了,总有一款符合您的要求,慢慢玩转吧。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 193,968评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,682评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,254评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,074评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,964评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,055评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,484评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,170评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,433评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,512评论 2 308
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,296评论 1 325
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,184评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,545评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,880评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,150评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,437评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,630评论 2 335

推荐阅读更多精彩内容