桑基图的一些画法

桑基图的一些画法

知识星球上有个小伙伴非常想学习桑基图的画法,所以我今天就搜罗下 R 语言里面绘制桑基图的一些方法。最推荐的方法是使用 ggalluvial 绘制。其他的方法仅供参考,大家根据自己的喜好学习即可。当然绘制桑基图的方法还有很多,本文介绍的三种是我觉得比较好用的。

视频讲解

构造示例数据

首先我们需要构造一个示例数据集用于接下来的演示,这里我使用的是我的微信好友数据里面的省份、城市、性别变量。这个数据可以用下面的 Python 脚本获取:

1
2
3
4
5
6
import itchat
import pandas as pd
itchat.auto_login(hotReload = True)
friends = itchat.get_friends(update = True)
friends = pd.DataFrame(friends)
friends.to_csv("friends.csv")

如果你的微信无法通过这种方式导出好友数据,可以直接使用我的 friends.csv 数据集:

代码去哪了?

代码可以加入我的知识星球后从知识星球下载附件获取~
要了解如何加入我的知识星球,可以阅读关于界面或者添加我的微信咨询。

df 是这样的:

是否记得这是我之前介绍的一个小技巧,为 datatable 表格控件添加下载按钮。

1
2
3
4
5
6
7
8
df %>% 
DT::datatable(
extensions = 'Buttons',
options = list(dom = 'Blfrtip',
buttons = c('copy', 'csv', 'excel',
'pdf', 'print'),
lengthMenu = list(c(10, 25, 50 ,-1),
c(10, 25, 50, "All"))))

使用 sankeywheel 绘制

介绍桑基图画法的教程当然首先要介绍我自己写的 R 包啦,我有一个 sankeywheel 包可以用来绘制桑基图,其实我在 探索微信好友数据 的那个教程里面已经介绍过了这个 R 包的使用,这里重复下:

代码去哪了?

代码可以加入我的知识星球后从知识星球下载附件获取~
要了解如何加入我的知识星球,可以阅读关于界面或者添加我的微信咨询。

但是这样是不是有点太“长”了?我们可以把省份分开成左右两部分:

代码去哪了?

代码可以加入我的知识星球后从知识星球下载附件获取~
要了解如何加入我的知识星球,可以阅读关于界面或者添加我的微信咨询。

用过 sankeywheel 包的同学都知道这个包还有另外一个功能,就是它也可以绘制和弦图。是绘制桑基图还是和弦图是有 type 参数决定的,type 参数的默认值是 “dependencywheel”,也就是说默认绘制的就是和弦图,之所以这样设置,是因为我觉得这个单词不好写:

代码去哪了?

代码可以加入我的知识星球后从知识星球下载附件获取~
要了解如何加入我的知识星球,可以阅读关于界面或者添加我的微信咨询。

组合多个 HTML 控件可以使用 manipulateWidget 包:

代码去哪了?

代码可以加入我的知识星球后从知识星球下载附件获取~
要了解如何加入我的知识星球,可以阅读关于界面或者添加我的微信咨询。

使用 ggalluvial 绘制

这个方法就非常重要了,大家一定要掌握。

首先我们导入 ggalluvial 包,对 df 变量进行分组计数并把返回的结果保存到 pg 数据框里面:

代码去哪了?

代码可以加入我的知识星球后从知识星球下载附件获取~
要了解如何加入我的知识星球,可以阅读关于界面或者添加我的微信咨询。

然后就可以绘制一幅基于 ggplot2 的桑基图了:

代码去哪了?

代码可以加入我的知识星球后从知识星球下载附件获取~
要了解如何加入我的知识星球,可以阅读关于界面或者添加我的微信咨询。

我们可以通过下面的方式自定义 y 轴的标签:

代码去哪了?

代码可以加入我的知识星球后从知识星球下载附件获取~
要了解如何加入我的知识星球,可以阅读关于界面或者添加我的微信咨询。

大家一定注意到这个图存在很严重的标签重叠问题,有两个解决办法:

解决文本标签重合的方法 1: ggrepel::geom_text_repel

代码去哪了?

代码可以加入我的知识星球后从知识星球下载附件获取~
要了解如何加入我的知识星球,可以阅读关于界面或者添加我的微信咨询。

解决文本标签重合的方法 2: ggfittext::geom_fit_text

代码去哪了?

代码可以加入我的知识星球后从知识星球下载附件获取~
要了解如何加入我的知识星球,可以阅读关于界面或者添加我的微信咨询。

ggalluvial 包的详细用法可以参考作者给出的参考文档:

1
vignette("ggalluvial")

使用 alluvial 绘制

alluvial 包是基于基础绘图系统封装的,似乎不容易解决文本标签相互重叠的问题:

代码去哪了?

代码可以加入我的知识星球后从知识星球下载附件获取~
要了解如何加入我的知识星球,可以阅读关于界面或者添加我的微信咨询。

使用 echarts4r 绘制

这个也蛮好用的:

代码去哪了?

代码可以加入我的知识星球后从知识星球下载附件获取~
要了解如何加入我的知识星球,可以阅读关于界面或者添加我的微信咨询。

以后搜集到其他好用又好看的方法再分享给大家哈。

知识星球附件链接:https://t.zsxq.com/6IIYnYZ

#

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×