桑基图可视化-使用R/python绘制桑基图

背景:使用R/python绘制桑基图可视化。

  • 使用R绘制桑基图
    需要下载两个特定版本的包:
  1. dplyr v1.0.1
  2. ggalluvial_soft v0.12.5
    )
    下载特定版本R包的安装方法详见R包的安装的多种方式整理(R包与R版本或者bioconductor版本不适配)soft-01 - 简书 (jianshu.com)

准备数据格式如下:


image.png

每一列代表一个对应关系,绘图需要构建一个这样的输入列表信息。

桑基图绘制代码:

my_sankey<-function(file_input,file_out){
library("ggplot2")
library("ggalluvial")
df <- read.table(file_input, header = 1)
mycol <- rep(c("#223D6C","#D20A13","#FFD121","#088247","#11AA4D","#58CDD9",
               "#7A142C","#5D90BA","#029149","#431A3D","#91612D","#6E568C",
               "#E0367A","#D8D155","#64495D","#7CC767"),2)
UCB_lodes <- to_lodes_form(df[,1:ncol(df)],
                           axes = 1:ncol(df),
                           id = "Cohort")
pdf(file_out,width = 12, height = 8)
pp<-ggplot(UCB_lodes,
       aes(x = x, stratum = stratum, alluvium = Cohort,
           fill = stratum, label = stratum)) +
  scale_x_discrete(expand = c(0, 0)) +
  geom_flow(width = 1/8) + #线跟方块间空隙的宽窄
  geom_stratum(alpha = .9,width = 1/10) + #方块的透明度、宽度
  geom_text(stat = "stratum", size = 3,color="black") + #文字大小、颜色

  #不喜欢默认的配色方案,用前面自己写的配色方案
  scale_fill_manual(values = mycol) +

  xlab("") + ylab("") +
  theme_bw() + #去除背景色
  theme(panel.grid =element_blank()) + #去除网格线
  theme(panel.border = element_blank()) + #去除外层边框
  theme(axis.line = element_blank(),axis.ticks = element_blank(),axis.text = element_blank()) + #去掉坐标轴
  ggtitle("")+
  guides(fill = FALSE)
print(pp)
dev.off()
}
#'函数调用
my_sankey("SangKey_input.txt","Sankey.pdf")
image.png

原文:桑基图(SanKey) | 教程 (代码重新) - 知乎 (zhihu.com)

  • 使用python绘制桑基图
    这个脚本好像只支持两列输入格式。
import pandas as pd
from pyecharts.charts import Sankey
from pyecharts import options as opts
# pd.set_option('display.max_columns',20)
# pd.set_option('display.max.rows',20000)

def createSankey(dir_in,rel_species="original",qur_species="predicted",species="species"):
    # data_in=pd.read_csv(dir_in,header=None)
    data_in=dir_in
    data=pd.DataFrame(columns=["original","predicted","number"])
    aa=data_in["predicted"].groupby(data_in["original"]).value_counts()
    # print(aa)
    cc=[]
    dd=[]
    for i in range(len(aa.index)):
        str_a=str(aa.index[i][0])
        cc.append(str_a)
        str_b=str(aa.index[i][1])
        dd.append(str_b)
    bb=aa.values.tolist()
    data["original"]=cc
    data["predicted"]=dd
    data["number"]=bb
    # print(data_out)

    data.columns=["rel","pre","num"]
    data.dropna(axis=0,how="any",inplace=True) #生成一个没有空值的一对一同源的pd表格
    # print(data.head())
    def changeNames1(dataa):
        a=[]
        a= rel_species+"_"+dataa['rel']
        return a
    def changeNames2(dataa):
        a=[]
        a=qur_species+"_"+dataa['pre']
        return a
        # dataa["num"]=dataa["num"]
    print("not ok")
    data["rel"]=data.apply(lambda r:changeNames1(r),axis=1)
    data["pre"]=data.apply(lambda r:changeNames2(r),axis=1)
    
    def createNode(a,b):
        nodes=[]
        for i in range(0, len(a)):
            dic = {}
            if(len(a[i])!=0):

                dic["name"] = a[i]
                nodes.append(dic)
            else:
                pass
        for j in range(0, len(b)):
            dic={}
            if(len(b[j])!=0):

                dic["name"] = b[j]
                nodes.append(dic)
            else:
                pass
        return nodes
    sig_rel=list(set(data["rel"].tolist()))
    sig_pre=list(set(data["pre"].tolist()))
    # sig_rel=sig_data["rel"].tolist()
    # sig_pre=sig_data["pre"].tolist()
    sig_nodes=createNode(sig_rel,sig_pre)
    # print(sig_nodes)
    def createLinks(dataa):
        links = []
        for i in dataa.values:
            dic = {}
            if(len(i[0])!=0):
                dic["source"]=i[0]
                dic["target"]=i[1]
                dic["value"]=i[2]
                links.append(dic)
            else:
                pass
        return links
    sig_links=createLinks(data)
    # print(sig_links)
    
    c=Sankey()
    c.add(
        series_name="the number of cells",
        nodes=sig_nodes,
        links=sig_links,
        pos_top="10%",  #设置图片离标题的高度
        #pos_right="5%",
        #pos_bottom="5%",
        pos_left="5%",
        is_draggable=False, #设置是否可以拖动节点
        focus_node_adjacency=True,
        linestyle_opt=opts.LineStyleOpts(opacity=0.2, curve=0.5, color="source",type_="dotted"),
        label_opts=opts.LabelOpts(position="right",),
    )
    c.set_global_opts(
        title_opts=opts.TitleOpts(title="left:"+rel_species+";"+"right:"+qur_species)
    )

    # 输出html可视化结果
    dir_out="./"+species+"_sankey.html"
    c.render(dir_out)
# createGraph("./datain/data_in.txt")

python脚本绘制出来是html网页版本,可以交互。


image.png

总结:2023年11月9日。

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

推荐阅读更多精彩内容