最近年中总结,我们学习一下基础知识
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)
# 绘制一个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
}
使用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()
使用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")
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")
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")
origin版本(非代码,手动操作)
数据准备
在之前的文章中有提到按“F11”键就可以快速进入origin的“Origin central”直接套用模板去学习作图,如下图,在新版的Origin 2019已将“Origin centra1”改为“Learning center”。 今天我们就直接用它的实例数据作图。
双击实例中的图表即可打开实例图表的工程文件,我这里只需数据,所以复制了一份到文件夹Folder1中,数据为历史上著名的泰坦尼克号事故中旅客和船员的是否获救记录(如下图)。数据只要是原始的分类记录即可,不需要手动计数。注意,Origin 2019的数据介绍弄错了,嗯,希望它接下来改进吧。
双坐标轴图
为了便于理解,我这里先画两个坐标轴的桑基图,看一下成人和小孩的幸存情况。类似Excel的操作,将鼠标指针悬停在表格列名上然后选中3、4列数据(包括分组数据),如下。
然后进入Plot菜单,找到Parallel Sets。
点击一下Parallel Sets即可完成绘制,初始结果如下:
可见孩子的存活比例比成人高,虽然女人和孩子可优先乘坐救生船,但仍有约一半的小孩没能获救。
三坐标轴
接下来增加点复杂度,同样的方法选择数据,这次加入性别数据,如下图。
绘制的初始结果如下:
类似于常规图表,双击坐标轴可以对坐标轴的粗细、颜色、刻度朝向等进行调整,如下。
双击图表区域,在Plot Details窗口也可改变颜色,可选择已有的配色方案,比如这里选Q05。
类似《如何用Origin绘制分边小提琴图》一文,如果对Q05的颜色不满意,还可点右侧的“✏”,自定义颜色列表,如下图。
调整配色后的结果如下:
勾选Combined Sets可将相同“流向”的数据进行合并,如下图。
具体的合并方式和结果见下图:
四坐标轴
同样的方法将4列数据全选,绘制结果如下图:
Transparency调整颜色的透明度,Curvature(曲率) 调整颜色“条带”的转角。
如果将Curvature(曲率)值调为0 %,就得到下图的效果。“直的”也不错,嗯,我还是觉得“弯的”比较好看。
曲率这里改回默认的30 %,换一下配色,最终可得到多种效果,如下:
个人都试了一下,origin最好,可视化操作,不用写代码,而且相当好看