R语言ggalluvia包优雅的绘制桑基图

桑基图通常用于表示能量、物料、资本等数据从一个地方流入另一个地方。左边代表留出点,右边代表流入点,中间带宽表示流入量的大小,因此,我们通过桑基图清晰的看到两个节点的数据流动。今天介绍一下ggalluvia包绘制桑基图,ggalluvia包的特点是相对操作简单,容易上手。

在这里插入图片描述
先导入数据和R包

library(foreign)
library(ggplot2)
library(ggalluvial)
library(networkD3)
bc <- read.spss("E:/r/test/tree_car.sav",
                use.value.labels=F, to.data.frame=T)

在这里插入图片描述
我们来看下数据,car就是汽车售价,age是年龄,gender是性别,inccat是收入,这里分成4个等级,ed是教育程度。(公众号回复:汽车销售,可以获得该数据)。
我们处理一下数据,把分类变量转换成因子,然后加上一个标签。

bc$ed<-factor(bc$ed,levels=c(1:5),labels=c("小学","初中","高中","大学","博士"))
bc$inccat<-factor(bc$inccat,levels=c(1:4),labels=c("低收入","中低收入","中等收入","富裕"))
bc$gender<-ifelse(bc$gender=="m",1,0)
bc$gender<-factor(bc$gender,levels = c(0,1),labels=c("女性","男性"))
bc$marital<-factor(bc$marital,levels = c(0,1),labels=c("未婚","已婚"))

在这里插入图片描述
这数据比较大,我们取其中一部分来绘制

bc<-bc[1:100,]

ggalluvial包绘制桑基图还是比较简单的,我们先要设置axis1流出节点,和axis2流入节点
假设我们想知道不同收入人群购车费用在不同性别的流动(演示而已,不具有实际意义),

ggplot(bc,aes(y = car, axis1 = inccat, axis2 =ed)) +
  geom_alluvium(aes(fill = gender))

在这里插入图片描述
这样一个最简单的桑基图就画好了,我们给它进一步设置宽度,加个方框和字体,fill这里表示方框的颜色

ggplot(bc,aes(y = car, axis1 = inccat, axis2 =ed)) +
  geom_alluvium(aes(fill = gender)) +
  geom_stratum(width = 1/6, fill = "black", color = "grey") +
  geom_label(stat = "stratum", aes(label = after_stat(stratum)))

在这里插入图片描述
还可以对X轴进一步设置

ggplot(bc,aes(y = car, axis1 = inccat, axis2 =ed)) +
  geom_alluvium(aes(fill = gender)) +
  geom_stratum(width = 1/6, fill = "black", color = "grey") +
  geom_label(stat = "stratum", aes(label = after_stat(stratum))) +
  scale_x_discrete(limits = c("收入层次", "教育程度"), expand = c(.05, .05)) +
  scale_fill_brewer(type = "qual", palette = "Set1") +
  ggtitle("收入和购买汽车关系")

在这里插入图片描述
在scale_fill_brewer中set可以对风格进一步设置

ggplot(bc,aes(y = car, axis1 = inccat, axis2 =ed)) +
  geom_alluvium(aes(fill = gender)) +
  geom_stratum(width = 1/6, fill = "black", color = "grey") +
  geom_label(stat = "stratum", aes(label = after_stat(stratum))) +
  scale_x_discrete(limits = c("收入层次", "教育程度"), expand = c(.05, .05)) +
  scale_fill_brewer(type = "qual", palette = "Set3") +
  ggtitle("收入和购买汽车关系")

在这里插入图片描述
我们还可以进一步增加中间的节点

ggplot(bc,aes(y = car, axis1 = inccat, axis2 =ed,axis3 = marital)) +
  geom_alluvium(aes(fill = gender)) +
  geom_stratum(width = 1/6, fill = "black", color = "grey") +
  geom_label(stat = "stratum", aes(label = after_stat(stratum))) +
  scale_x_discrete(limits = c("Gender", "Dept"), expand = c(.05, .05)) +
  scale_fill_brewer(type = "qual", palette = "Set3") +
  ggtitle("收入和购买汽车关系")

在这里插入图片描述
我们可以使用coord_flip()函数把它倒置过来

ggplot(bc,aes(y = car,
              axis1 = inccat, axis2 = ed, axis3 = marital)) +
  geom_alluvium(aes(fill = gender),
                width = 1/8, knot.pos = 0, reverse = FALSE) +
  scale_fill_manual(values = c("男性"= "blue", "女性" = "red")) +
  guides(fill = "none") +
  geom_stratum(alpha = .4, width = 1/8, reverse = FALSE) +
  geom_text(stat = "stratum", aes(label = after_stat(stratum)),
            reverse = FALSE) +
  scale_x_continuous(breaks = 1:3, labels = c("inccat", "ed", "marital")) +
  coord_flip() +
  ggtitle("收入和购买汽车关系")

在这里插入图片描述
倒置后也可以进一步更换风格

ggplot(bc,aes(y = car,
              axis1 = inccat, axis2 = ed, axis3 = marital)) +
  geom_alluvium(aes(fill = gender),
                width = 1/8, knot.pos = 0, reverse = FALSE) +
  scale_fill_manual(values = c("男性"= "blue", "女性" = "red")) +
  guides(fill = "none") +
  geom_stratum(alpha = .4, width = 1/8, reverse = FALSE) +
  geom_text(stat = "stratum", aes(label = after_stat(stratum)),
            reverse = FALSE) +
  scale_fill_brewer(type = "qual", palette = "Set3")+
  scale_x_continuous(breaks = 1:3, labels = c("inccat", "ed", "marital")) +
  coord_flip() +
  ggtitle("收入和购买汽车关系")

在这里插入图片描述
下期再介绍使用networkD3包绘制桑基图。

  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
你好!对于R语言多层桑基图绘制,你可以使用`ggalluvial`来实现。这个提供了一种直观的方式来展示微生物组分类学及丰度的信息。 首先,你需要安装`ggalluvial`。可以使用以下代码安装: ```R install.packages("ggalluvial") ``` 安装完成后,你可以加载这个: ```R library(ggalluvial) ``` 接下来,你需要准备绘制桑基图所需的数据。通常,你需要一个数据框,其中含了不同分类学级别的分类信息和相应的丰度值。 例如,假设你有以下示例数据: ```R data <- data.frame( Kingdom = c("Bacteria", "Bacteria", "Bacteria", "Archaea", "Archaea"), Phylum = c("Proteobacteria", "Firmicutes", "Actinobacteria", "Euryarchaeota", "Crenarchaeota"), Class = c("Alphaproteobacteria", "Clostridia", "Actinobacteria", "Methanobacteria", "Thermoprotei"), Abundance = c(0.4, 0.3, 0.1, 0.05, 0.15) ) ``` 接下来,你可以使用`ggplot`函数创建一个基础的绘图对象,并使用`geom_flow`函数来添加桑基图的流动路径: ```R ggplot(data, aes(axis1 = Kingdom, axis2 = Phylum, axis3 = Class, weight = Abundance)) + geom_flow() ``` 这将创建一个简单的桑基图,其中不同分类学级别之间的流动路径根据丰度值的权重进行调整。 你可以根据需要进一步自定义绘图,例如添加标签、调整颜色等。`ggalluvial`提供了很多选项来自定义桑基图的外观和布局。 希望这个回答能帮到你!如果你有任何其他问题,请随时问我。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天桥下的卖艺者

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值