桑基图的绘制(基础知识,R与origin)

最近年中总结,我们学习一下基础知识

R版本

桑基图绘制


清除当前环境中的变量

rm(list=ls())

设置工作目录

setwd("C:/Users/Dell/Desktop/R_Plots/23sankey/")

使用riverplot包绘制桑基图

# 安装并加载所需的R包
#install.packages("riverplot")
library(riverplot)

# 构建测序数据集
nodes <- c( LETTERS[1:5] )
nodes
## [1] "A" "B" "C" "D" "E"

edges <- list( A = list( C= 6 ), 
               B = list( C= 5 ),
               C = list( D= 4 ),
               E = list( C= 3 )
               )
edges
## $A
## $A$C
## [1] 6
##
##
## $B
## $B$C
## [1] 5
##
##
## $C
## $C$D
## [1] 4
##
##
## $E
## $E$C
## [1] 3

# 使用makeRiver函数构造riverplot对象
r <- makeRiver( nodes, edges, 
                node_xpos= c( 1,1,2,3,3 ),
                node_labels= c( A= "Node A", B= "Node B", C= "Node C", D= "Node D", E= "Node E" ),
                node_styles= list( A= list( col= "yellow" ), D= list( col= "blue" ), E= list( col= "red" )))
r
## $edges
##        ID N1 N2 Value
## A->C A->C  A  C     6
## B->C B->C  B  C     5
## C->D C->D  C  D     4
## E->C E->C  E  C     3
## 
## $nodes
##   ID x labels
## A  A 1 Node A
## B  B 1 Node B
## C  C 2 Node C
## D  D 3 Node D
## E  E 3 Node E
## 
## $styles
## $styles$A
## $styles$A$col
## [1] "yellow"
## 
## 
## $styles$D
## $styles$D$col
## [1] "blue"
## 
## 
## $styles$E
## $styles$E$col
## [1] "red"
## 
## 
## 
## attr(,"class")
## [1] "list"      "riverplot"

# 使用riverplot函数绘制桑基图
riverplot(r)

image
# 绘制一个DNA双螺旋
# a DNA strand
plot.new()
par( usr= c( 0, 4, -2.5, 2.5 ) )

w <- 0.4
cols <- c( "blue", "green" )
init <- c( -0.8, -0.5 )
pos  <- c( 1, -1 )
step <- 0.5

# Draw a curved segment
for( i in rep( rep( c( 1, 2 ), each= 2 ), 5 ) ) {
  curveseg( init[i], init[i] + step, pos[1], pos[2], width= w, col= cols[i] )
  init[i] <- init[i] + step
  pos <- pos * -1
}

image

使用ggforce包绘制桑基图

# 安装并加载所需的R包
#install.packages("ggforce")
library(ggforce)

# 构建示例数据
data <- reshape2::melt(Titanic)
head(data)
##  Class    Sex   Age Survived value
## 1   1st   Male Child       No     0
## 2   2nd   Male Child       No     0
## 3   3rd   Male Child       No    35
## 4  Crew   Male Child       No     0
## 5   1st Female Child       No     0
## 6   2nd Female Child       No     0

data <- gather_set_data(data, 1:4)
head(data)
##   Class    Sex   Age Survived value id     x    y
## 1   1st   Male Child       No     0  1 Class  1st
## 2   2nd   Male Child       No     0  2 Class  2nd
## 3   3rd   Male Child       No    35  3 Class  3rd
## 4  Crew   Male Child       No     0  4 Class Crew
## 5   1st Female Child       No     0  5 Class  1st
## 6   2nd Female Child       No     0  6 Class  2nd

# 使用geom_parallel_setsh函数绘制桑基图
ggplot(data, aes(x, id = id, split = y, value = value)) +
  geom_parallel_sets(aes(fill = Sex), alpha = 0.5, axis.width = 0.1) +
  geom_parallel_sets_axes(axis.width = 0.2,fill="black",color="red") +
  geom_parallel_sets_labels(colour = 'white',angle = 45) +
  theme_bw()

image

使用ggalluvial包绘制桑基图

# 安装并加载所需的R包
#install.packages("ggalluvial")
library(ggalluvial)

# 使用geom_alluvium函数绘制桑基图
admissions <- as.data.frame(UCBAdmissions)
head(admissions)
##      Admit Gender Dept Freq
## 1 Admitted   Male    A  512
## 2 Rejected   Male    A  313
## 3 Admitted Female    A   89
## 4 Rejected Female    A   19
## 5 Admitted   Male    B  353
## 6 Rejected   Male    B  207

ggplot(admissions,
       aes(y = Freq, axis1 = Gender, axis2 = Dept)) +
  geom_alluvium(aes(fill = Admit), width = 1/12) +
  geom_stratum(width = 1/12, 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 = "Set1") +
  ggtitle("UC Berkeley admissions and rejections, by sex and department")

image
data <- as.data.frame(Titanic)
head(data)
##   Class    Sex   Age Survived Freq
## 1   1st   Male Child       No    0
## 2   2nd   Male Child       No    0
## 3   3rd   Male Child       No   35
## 4  Crew   Male Child       No    0
## 5   1st Female Child       No    0
## 6   2nd Female Child       No    0

ggplot(data,
       aes(y = Freq,
           axis1 = Survived, axis2 = Sex, axis3 = Class)) +
  geom_alluvium(aes(fill = Class),width = 0, 
                knot.pos = 0, reverse = FALSE) +
  guides(fill = FALSE) +
  geom_stratum(width = 1/8, reverse = FALSE) +
  geom_text(stat = "stratum", aes(label = after_stat(stratum)),reverse = FALSE) +
  scale_x_continuous(breaks = 1:3, labels = c("Survived", "Sex", "Class")) +
  coord_flip() +
  ggtitle("Titanic survival by class and sex")

image
data(vaccinations)
levels(vaccinations$response) <- rev(levels(vaccinations$response))
head(vaccinations)
##      survey freq subject response start_date   end_date
## 1 ms153_NSA   48       1  Missing 2010-09-22 2010-10-25
## 2 ms153_NSA    9       2  Missing 2010-09-22 2010-10-25
## 3 ms153_NSA   66       3  Missing 2010-09-22 2010-10-25
## 4 ms153_NSA    1       4  Missing 2010-09-22 2010-10-25
## 5 ms153_NSA   11       5  Missing 2010-09-22 2010-10-25
## 6 ms153_NSA    1       6  Missing 2010-09-22 2010-10-25

ggplot(vaccinations,
       aes(x = survey, stratum = response, alluvium = subject,
           y = freq,
           fill = response, label = response)) +
  scale_x_discrete(expand = c(.1, .1)) +
  geom_flow() +
  geom_stratum(alpha = .5) +
  geom_text(stat = "stratum", size = 4) +
  theme(legend.position = "none") +
  ggtitle("vaccination survey responses at three points in time")

image

origin版本(非代码,手动操作)

数据准备

在之前的文章中有提到按“F11”键就可以快速进入origin的“Origin central”直接套用模板去学习作图,如下图,在新版的Origin 2019已将“Origin centra1”改为“Learning center”。 今天我们就直接用它的实例数据作图。

###

双击实例中的图表即可打开实例图表的工程文件,我这里只需数据,所以复制了一份到文件夹Folder1中,数据为历史上著名的泰坦尼克号事故中旅客和船员的是否获救记录(如下图)。数据只要是原始的分类记录即可,不需要手动计数。注意,Origin 2019的数据介绍弄错了,嗯,希望它接下来改进吧。

image

双坐标轴图

为了便于理解,我这里先画两个坐标轴的桑基图,看一下成人和小孩的幸存情况。类似Excel的操作,将鼠标指针悬停在表格列名上然后选中3、4列数据(包括分组数据),如下。

image

然后进入Plot菜单,找到Parallel Sets。

image

点击一下Parallel Sets即可完成绘制,初始结果如下:

image

可见孩子的存活比例比成人高,虽然女人和孩子可优先乘坐救生船,但仍有约一半的小孩没能获救。

三坐标轴

接下来增加点复杂度,同样的方法选择数据,这次加入性别数据,如下图。

image

绘制的初始结果如下:

image

类似于常规图表,双击坐标轴可以对坐标轴的粗细、颜色、刻度朝向等进行调整,如下。

image

双击图表区域,在Plot Details窗口也可改变颜色,可选择已有的配色方案,比如这里选Q05。

image

类似《如何用Origin绘制分边小提琴图》一文,如果对Q05的颜色不满意,还可点右侧的“✏”,自定义颜色列表,如下图。

image

调整配色后的结果如下:

image

勾选Combined Sets可将相同“流向”的数据进行合并,如下图。

image

具体的合并方式和结果见下图:

image

四坐标轴

同样的方法将4列数据全选,绘制结果如下图:

image

Transparency调整颜色的透明度,Curvature(曲率) 调整颜色“条带”的转角。

image

如果将Curvature(曲率)值调为0 %,就得到下图的效果。“直的”也不错,嗯,我还是觉得“弯的”比较好看。

image

曲率这里改回默认的30 %,换一下配色,最终可得到多种效果,如下:

image

个人都试了一下,origin最好,可视化操作,不用写代码,而且相当好看

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