Sankey风格可视化
创建于:2024年11月21日
使用 OpenAI 01 Preview 回答 OpenAI01
创建于:2024年11月21日
使用 OpenAI 01 Preview 回答 OpenAI01
连接单一细胞类型
用户希望通过优化Python代码,将相同的单一细胞类型跨群体连接起来,类似于R语言中的桑基图。
调整数据可视化
我正在将Python中的Plotly代码调整为使用Python创建类似R中ggplot与ggalluvial包的Alluvial图效果。
迈入绘图领域
正在探索利用Plotly创造类似于冲击桑基图的图形,逐步设计和调整函数以实现这个目标。使用showlegend和height、width调整图形显示。
选择数据可视化工具
考虑使用Plotly的不同数据可视化工具,如Sankey图或Parcats图,来制作连接相同细胞类型的群组的alluvial图。
使用Plotly的桑基图创建图表
创建节点和链接
我正在构建桑基图,首先整理节点标签列表,然后确定每个标签的索引。接着定义源索引、目标索引和值,最后创建函数来生成alluvial plot。
将数据链接
正在将celltype_ratio中的每一行与组和细胞类型链接,使用相对频率作为值。比如,组为'Sample1',细胞类型为'Type1',相对频率为某个值。
指明节点和链接
列出了节点和链接之间的匹配关系,设计了Sankey图的标签和颜色。图表更新后的标题和字体大小已确定。
定义和调整颜色
我在定义节点颜色和链接颜色时,使用默认色和轻灰色来区分组节点和细胞类型节点,并且确保链接颜色与细胞类型的颜色相匹配。这将帮助实现预期效果。
创建节点和链接
我正在为所有节点创建列表,包括组和细胞类型。然后,我寻找并应用了组和细胞类型之间的连接,设置了颜色和权重。
您希望修改代码,以在可视化中将相同的细胞类型在不同的组之间连接起来,类似于Alluvial图的效果。下面是修改后的代码,使用Plotly的Sankey图来实现这种效果:
import pandas as pd import plotly.graph_objs as go import os print("当前工作目录是:", os.getcwd()) # 示例数据 data = { 'group': ['Sample1', 'Sample1', 'Sample1', 'Sample2', 'Sample2', 'Sample2'], 'celltype': ['Type1', 'Type2', 'Type3', 'Type1', 'Type2', 'Type3'], 'n': [100, 200, 150, 120, 180, 130] } scedata = pd.DataFrame(data) # 计算相对频率 celltype_ratio = scedata.groupby(['group', 'celltype'])['n'].sum().reset_index() celltype_ratio['relative_freq'] = celltype_ratio.groupby('group')['n'].transform(lambda x: x / x.sum()) # 颜色调色板 mycolor = ['#efb306', '#7db954', '#852f88', '#4e54ac', '#0f8096'] # 模拟 Alluvial 图风格的调整 def create_alluvial_like_plot(df): # 创建节点列表 groups = df['group'].unique() celltypes = df['celltype'].unique() nodes = list(groups) + list(celltypes) label_to_index = {label: idx for idx, label in enumerate(nodes)} # 创建链接 sources = [] targets = [] values = [] colors = [] for idx, row in df.iterrows(): group = row['group'] celltype = row['celltype'] value = row['relative_freq'] source_idx = label_to_index[group] target_idx = label_to_index[celltype] sources.append(source_idx) targets.append(target_idx) values.append(value) # 获取细胞类型对应的颜色 celltype_idx = list(celltypes).tolist().index(celltype) colors.append(mycolor[celltype_idx % len(mycolor)]) # 设置节点颜色 node_colors = ['lightgray'] * len(groups) + [mycolor[i % len(mycolor)] for i in range(len(celltypes))] # 创建 Sankey 图 fig = go.Figure(data=[go.Sankey( node=dict( pad=15, thickness=20, line=dict(color="black", width=0.5), label=nodes, color=node_colors ), link=dict( source=sources, target=targets, value=values, color=colors ) )]) fig.update_layout( title_text="冲击桑基图(Alluvial风格)", font_size=10 ) return fig # 生成图表 alluvial_like = create_alluvial_like_plot(celltype_ratio) # 保存为HTML alluvial_like.write_html("alluvial_like_plot.html") print("图表已生成为 alluvial_like_plot.html")
此修改后的代码使用Plotly的Sankey图来模拟Alluvial图的效果,将相同的细胞类型在不同的组之间连接起来,实现了您在R代码中使用geom_flow
的效果。
解释:
group
)和细胞类型(celltype
)作为节点。value
)为相对频率。go.Sankey
绘制桑基图,并设置布局和样式。效果:
生成的图表将显示不同的组(如Sample1和Sample2)与各个细胞类型之间的流动关系,链接的宽度代表相对频率,同一细胞类型在不同组之间的颜色一致,便于跟踪和比较。