vlambda博客
学习文章列表

【R语言】全网最简单plotly动态旭日图教程

按照一般的流程,大多数R学习者会依托ggplot2进行数据可视化学习。但对于部分人来说,这个过程可能(注意是可能)存在两个问题:一是学习曲线稍显陡峭,时间成本较高;二是ggplot2更偏科学绘图,出来的成品有那么一丝呆萌气息?(当然这是技术不行造成的,我知道……)


开源的第三方可视化神器——plotly,完美地解决了这两个问题,既能够快速上手出图,又使作品尽可能显得美观,而且还提供简单交互。


作为在数据分析域领享有盛名的成熟应用,plotly同时可以被R,python,javascript使用,也就意味着标准化的可视化流程超越了语言的限制,一定程度节省使用者技能迁移的成本。公司旗下还有企业版本的商业分析工具Dash,但是需要付费。更多详情见官网:https://plotly.com/r/



plotly提供大量基础模板可供使用,在每一种模板图形的介绍中会按照从入门到进阶的顺序给出示例代码,如果具备ggplot2基础将可以在短时间内学习作图,成为一个合格的调包侠。具体的模板包括基础统计图表、金融图表、科学图表、3D图等等。之前,尝试运行过一个3D模板,我的核心显卡差点当场崩溃。

【R语言】全网最简单plotly动态旭日图教程

【R语言】全网最简单plotly动态旭日图教程

【R语言】全网最简单plotly动态旭日图教程


总之,通过简单的照猫画虎就能实现酷炫的可视化作品,何况这种开源应用不需要担心版权问题,相比其他BI软件对个人使用者友好了不止一点。


点开网页上基础图像中的旭日图(sunburst),可以看到不同完善度层级的实例代码,今天的文章也会参考示例代码进行讲解。


最简单的示例代码:

library(plotly)
fig <- plot_ly( labels = c("Eve", "Cain", "Seth", "Enos", "Noam", "Abel", "Awan", "Enoch", "Azura"), parents = c("", "Eve", "Eve", "Seth", "Seth", "Eve", "Eve", "Awan", "Eve"), values = c(10, 14, 12, 10, 2, 6, 6, 4, 4), type = 'sunburst')
fig

【R语言】全网最简单plotly动态旭日图教程

得到以上图形。可以看到代码中比较关键的变量是labels,parents,values。labels必须涵盖所有出现的标签,parents则表示父级标签,这种父级关系的体现是通过和labels中的位置对应来实现的。所以当标签字符长度不一时,可能会对不齐,造成编码的混乱(比如我就写标签写到一半忘了自己在干啥)。


这种初级形态的缺点是没有重复标签,但在真实应用场景中有重复标签才符合实际情况。plotly网站给出了新的示例:Sunburst with Repeated Labels

library(plotly)
d <- data.frame( ids = c( "North America", "Europe", "Australia", "North America - Football", "Soccer", "North America - Rugby", "Europe - Football", "Rugby", "Europe - American Football","Australia - Football", "Association", "Australian Rules", "Autstralia - American Football", "Australia - Rugby", "Rugby League", "Rugby Union" ), labels = c( "North<br>America", "Europe", "Australia", "Football", "Soccer", "Rugby", "Football", "Rugby", "American<br>Football", "Football", "Association", "Australian<br>Rules", "American<br>Football", "Rugby", "Rugby<br>League", "Rugby<br>Union" ), parents = c( "", "", "", "North America", "North America", "North America", "Europe", "Europe", "Europe","Australia", "Australia - Football", "Australia - Football", "Australia - Football", "Australia - Football", "Australia - Rugby", "Australia - Rugby" ), stringsAsFactors = FALSE)
fig <- plot_ly(d, ids = ~ids, labels = ~labels, parents = ~parents, type = 'sunburst')
fig


因为原网站上起来并不太方便,所以我把这部分示例代码也复制过来给需要的同学。但我想说,写这部分示例代码的人其实并没有把一些问题讲得足够简单,属实有点……难懂 (或者人家大神不屑于干这种事)


所以我单独举了一个例子,假设有三家房产经纪公司:安家天下、链家、贝壳找房。每一家都下属东北、华北、西南三个区域,其中安家天下的西南区域,还下属成都、绵阳、达州三地。通过旭日图反映这个关系。

library(plotly)ids=c("安家天下","贝壳找房","安居客","安家天下-西南","安家天下-华北","安家天下-东北","贝壳找房-西南","贝壳找房-华北","贝壳找房-东北","安居客-西南","安居客-华北","安居客-东北","绵阳","达州","成都")labels=c("安家天下","贝壳找房","安居客","西南","华北","东北","西南","华北","东北","西南","华北","东北","绵阳","达州","成都")parents=c("","","","安家天下","安家天下","安家天下","贝壳找房","贝壳找房","贝壳找房","安居客","安居客","安居客","安家天下-西南","安家天下-西南","安家天下-西南")data=data.frame(ids,labels,parents)fig <- plot_ly(ids = data$ids, labels = data$labels, parents = data$parents, type = 'sunburst')fig


由于存在重复的标签,因此需要在labels和parents两个变量之外,新增一个ids变量,values变量在不加注数据的情况下可以不写。我从示例代码中学到的小技巧是,添加一个data数据框,而不是直接将相关变量带入函数计算。这样可以更清晰地理解不同变量之间的关系:

【R语言】全网最简单plotly动态旭日图教程


前文说过,父级和子级主要是通过parents和labels在位置上的一一对应来实现的,而重复出现的标签则通过ids的不同来区分。如labels中的“西南”,实际上拥有“安居客-西南”和“贝壳找房-西南”这样的不同身份。总之,在数据框中看这些对应关系,会变得更加清晰,这是示例中没(bu)有(xie)提到的。


最终出来的结果如下:

【R语言】全网最简单plotly动态旭日图教程



因为是交互式的图形,所以我录了个视频:


更多的案例还需要回到官网,大神们也画出了其他更复杂炫酷的图形:


好了,看到这里你可能会想这个东西到底有啥用?因为plotly的图形本身是可交互的,所以原则上讲应用到PPT演示当中会有较好的效果。至于其他的用处呢,别问,问就是不知道。



汤姆镇楼