iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >怎么使用Python绘制惊艳的桑基图
  • 421
分享到

怎么使用Python绘制惊艳的桑基图

2023-07-06 01:07:53 421人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

本篇内容介绍了“怎么使用python绘制惊艳的桑基图”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!桑基图简介很多时候,我们需要一种必须可视化

本篇内容介绍了“怎么使用python绘制惊艳的桑基图”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

桑基图简介

很多时候,我们需要一种必须可视化数据如何在实体之间流动的情况。例如,以居民如何从一个国家迁移到另一个国家为例。这里演示了有多少居民从英格兰迁移到北爱尔兰、苏格兰和威尔士。

怎么使用Python绘制惊艳的桑基图

从这个 桑基图 (Sankey)可视化中可以明显看出,从England迁移到Wales的居民多于从Scotland或Northern Ireland迁移的居民。

什么是桑基图?

桑基图通常描绘 从一个实体(或节点)到另一个实体(或节点)的数据流。

数据流向的实体被称为节点,数据流起源的节点是源节点(例如左侧的England),流结束的节点是 目标节点(例如右侧的Wales)。源节点和目标节点通常表示为带有标签的矩形。

流动本身由直线或曲线路径表示,称为链接。流/链接的宽度与流的量/数量成正比。在上面的例子中,从英格兰到威尔士的流动(即居民迁移)比从英格兰到苏格兰或北爱尔兰的流动(即居民迁移)更广泛(更多),表明迁移到威尔士的居民数量多于其他国家。

桑基图可用于表示能量、金钱、成本的流动,以及任何具有流动概念的事物。

米纳尔关于拿破仑入侵俄罗斯的经典图表可能是桑基图表最著名的例子。这种使用桑基图的可视化非常有效地显示了法国军队在前往俄罗斯和返回的途中是如何进步(或减少?)的。

怎么使用Python绘制惊艳的桑基图

本文中,我们使用 Python 的 plotly 绘制桑基图。

如何绘制桑基图?

本文使用 2021 年奥运会数据集绘制桑基图。该数据集包含有关奖牌总数的详细信息——国家、奖牌总数以及金牌、银牌和铜牌的单项总数。我们通过绘制一个桑基图来了解一个国家赢得的金牌、银牌和铜牌数。

df_medals = pd.read_excel("data/Medals.xlsx")print(df_medals.info())df_medals.rename(columns={'Team/NOC':'Country', 'Total': 'Total Medals', 'Gold':'Gold Medals', 'Silver': 'Silver Medals', 'Bronze': 'Bronze Medals'}, inplace=True)df_medals.drop(columns=['Unnamed: 7','Unnamed: 8','Rank by Total'], inplace=True)df_medals
RangeIndex: 93 entries, 0 to 92Data columns (total 9 columns): # Column Non-Null CountDtype--------- ------------------- 0 Rank 93 non-null int64 1 Team/NOC 93 non-null object  2 Gold 93 non-null int64 3 Silver 93 non-null int64 4 Bronze 93 non-null int64 5 Total93 non-null int64 6 Rank by Total93 non-null int64 7 Unnamed: 7 0 non-nullfloat64 8 Unnamed: 8 1 non-nullfloat64dtypes: float64(2), int64(6), object(1)memory usage: 6.7+ KBNone

怎么使用Python绘制惊艳的桑基图

桑基图绘图基础

使用 plotly 的 go.Sankey,该方法带有2 个参数 ——nodes 和 links (节点和链接)。

注意:所有节点——源和目标都应该有唯一的标识符。

在本文奥林匹克奖牌数据集情况中:

Source是国家。将前 3 个国家(美国、中国和日本)视为源节点。用以下(唯一的)标识符、标签和颜色来标记这些源节点:

  • 0:美国:绿色

  • 中国:蓝色

  • 日本:橙色

Target是金牌、银牌或铜牌。用以下(唯一的)标识符、标签和颜色来标记这些目标节点:

  • 金牌:金色

  • 银牌:银色

  • 铜牌:棕色

Link(源节点和目标节点之间)是每种类型奖牌的数量。在每个源中有3个链接,每个链接都以目标结尾——金牌、银牌和铜牌。所以总共有9个链接。每个环节的宽度应为金牌、银牌和铜牌的数量。用以下源标记这些链接到目标、值和颜色:

  • 0 (美国) 至 3,4,5 : 39, 41, 33

  • 1 (中国) 至 3,4,5 : 38, 32, 18

  • 2 (日本) 至 3,4,5 : 27, 14, 17

需要实例化 2 个 python dict 对象来表示

  • nodes (源和目标):标签和颜色作为单独的列表和

  • links:源节点、目标节点、值(宽度)和链接的颜色作为单独的列表

并将其传递给plotly的 go.Sankey。

列表的每个索引(标签、源、目标、值和颜色)分别对应一个节点或链接。

NODES = dict( # 0 1 23 4 5 label = ["United States of America", "People's Republic of China", "Japan", "Gold", "Silver", "Bronze"],color = ["seagreen", "dodgerblue", "orange", "gold", "silver", "brown" ],)LINKS = dict( source = [0,0,0,1,1,1,2,2,2], # 链接的起点或源节点target = [3,4,5,3,4,5,3,4,5], # 链接的目的地或目标节点value =[ 39, 41, 33, 38, 32, 18, 27, 14, 17], # 链接的宽度(数量)# 链接的颜色# 目标节点: 3-Gold4-Silver5-Bronzecolor = [ "lightgreen", "lightgreen", "lightgreen",# 源节点:0 - 美国 States of America"lightskyblue", "lightskyblue", "lightskyblue",# 源节点:1 - 中华人民共和国China"bisque", "bisque", "bisque"],)# 源节点:2 - 日本data = go.Sankey(node = NODES, link = LINKS)fig = go.Figure(data)fig.show()

怎么使用Python绘制惊艳的桑基图

这是一个非常基本的桑基图。但是否注意到图表太宽并且银牌出现在金牌之前?

接下来介绍如何调整节点的位置和宽度。

调整节点位置和图表宽度

为节点添加 x 和 y 位置以明确指定节点的位置。值应介于 0 和 1 之间。

NODES = dict( # 0 1 23 4 5 label = ["United States of America", "People's Republic of China", "Japan", "Gold", "Silver", "Bronze"],color = ["seagreen", "dodgerblue", "orange", "gold", "silver", "brown" ],)x = [ 0,0,0,0.5,0.5,0.5],y = [ 0,0.5,1,0.1,0.5,1],)data = go.Sankey(node = NODES, link = LINKS)fig = go.Figure(data)fig.update_layout(title="Olympics - 2021: Country &Medals",font_size=16)fig.show()

于是得到了一个紧凑的桑基图:

怎么使用Python绘制惊艳的桑基图

下面看看代码中传递的各种参数如何映射到图中的节点和链接。

怎么使用Python绘制惊艳的桑基图

代码如何映射到桑基图

添加有意义的悬停标签

我们都知道plotly绘图是交互的,我们可以将鼠标悬停在节点和链接上以获取更多信息。

怎么使用Python绘制惊艳的桑基图

带有默认悬停标签的桑基图

当将鼠标悬停在图上,将会显示详细信息。悬停标签中显示的信息是默认文本:节点、节点名称、传入流数、传出流数和总值。

例如:

  • 节点美国共获得11枚奖牌(=39金+41银+33铜)

  • 节点金牌共有104枚奖牌(=美国39枚,中国38枚,日本27枚)

如果我们觉得这些标签太冗长了,我们可以对此进程改进。使用hovertemplate参数改进悬停标签的格式

  • 对于节点,由于hoverlabels 没有提供新信息,通过传递一个空hovertemplate = ""来去掉hoverlabel

  • 对于链接,可以使标签简洁,格式为-

  • 对于节点和链接,让我们使用后缀"Medals"显示值。例如 113 枚奖牌而不是 113 枚。这可以通过使用具有适当valuefORMat和valuesuffix的update_traces函数来实现。

NODES = dict( # 0 1 23 4 5label = ["United States of America", "People's Republic of China", "Japan", "Gold", "Silver", "Bronze"],color = ["seagreen", "dodgerblue","orange", "gold", "silver", "brown" ],x = [ 0,0, 0,0.5,0.5,0.5],y = [ 0,0.5, 1,0.1,0.5,1],hovertemplate=" ",)LINK_LABELS = []for country in ["USA","China","Japan"]:for medal in ["Gold","Silver","Bronze"]:LINK_LABELS.append(f"{country}-{medal}")LINKS = dict(source = [0,0,0,1,1,1,2,2,2],  # 链接的起点或源节点 target = [3,4,5,3,4,5,3,4,5],  # 链接的目的地或目标节点 value =[ 39, 41, 33, 38, 32, 18, 27, 14, 17],  # 链接的宽度(数量)  # 链接的颜色 # 目标节点:3-Gold4 -Silver5-Bronze color = ["lightgreen", "lightgreen", "lightgreen", # 源节点:0 - 美国"lightskyblue", "lightskyblue", "lightskyblue", # 源节点:1 - 中国"bisque", "bisque", "bisque"],# 源节点:2 - 日本 label = LINK_LABELS,  hovertemplate="%{label}",)data = go.Sankey(node = NODES, link = LINKS)fig = go.Figure(data)fig.update_layout(title="Olympics - 2021: Country &Medals",font_size=16, width=1200, height=500,)fig.update_traces(valueformat='3D', valuesuffix='Medals', selector=dict(type='sankey'))fig.update_layout(hoverlabel=dict(bGColor="lightgray",font_size=16,font_family="Rockwell"))fig.show("png") #fig.show()

怎么使用Python绘制惊艳的桑基图

带有改进的悬停标签的桑基图

对多个节点和级别进行泛化相对于链接,节点被称为源和目标。作为一个链接目标的节点可以是另一个链接的源。

该代码可以推广到处理数据集中的所有国家。

还可以将图表扩展到另一个层次,以可视化各国的奖牌总数。

NUM_COUNTRIES = 5X_POS, Y_POS = 0.5, 1/(NUM_COUNTRIES-1)NODE_COLORS = ["seagreen", "dodgerblue", "orange", "palevioletred", "darkcyan"]LINK_COLORS = ["lightgreen", "lightskyblue", "bisque", "pink", "lightcyan"]source = []node_x_pos, node_y_pos = [], []node_labels, node_colors = [], NODE_COLORS[0:NUM_COUNTRIES]link_labels, link_colors, link_values = [], [], [] # 第一组链接和节点for i in range(NUM_COUNTRIES):source.extend([i]*3)node_x_pos.append(0.01)node_y_pos.append(round(i*Y_POS+0.01,2))country = df_medals['Country'][i]node_labels.append(country) for medal in ["Gold", "Silver", "Bronze"]:link_labels.append(f"{country}-{medal}")link_values.append(df_medals[f"{medal} Medals"][i])link_colors.extend([LINK_COLORS[i]]*3)source_last = max(source)+1target = [ source_last, source_last+1, source_last+2] * NUM_COUNTRIEStarget_last = max(target)+1node_labels.extend(["Gold", "Silver", "Bronze"])node_colors.extend(["gold", "silver", "brown"])node_x_pos.extend([X_POS, X_POS, X_POS])node_y_pos.extend([0.01, 0.5, 1])# 最后一组链接和节点source.extend([ source_last, source_last+1, source_last+2])target.extend([target_last]*3)node_labels.extend(["Total Medals"])node_colors.extend(["grey"])node_x_pos.extend([X_POS+0.25])node_y_pos.extend([0.5])for medal in ["Gold","Silver","Bronze"]:link_labels.append(f"{medal}")link_values.append(df_medals[f"{medal} Medals"][:i+1].sum())link_colors.extend(["gold", "silver", "brown"])print("node_labels", node_labels)print("node_x_pos", node_x_pos); print("node_y_pos", node_y_pos)
node_labels ['United States of America', "People's Republic of China",  'Japan', 'Great Britain', 'ROC', 'Gold', 'Silver',  'Bronze', 'Total Medals']node_x_pos [0.01, 0.01, 0.01, 0.01, 0.01, 0.5, 0.5, 0.5, 0.75]node_y_pos [0.01, 0.26, 0.51, 0.76, 1.01, 0.01, 0.5, 1, 0.5]
# 显示的图NODES = dict(pad= 20, thickness = 20,  line = dict(color = "lightslategrey", width = 0.5), hovertemplate=" ", label = node_labels,  color = node_colors, x = node_x_pos,  y = node_y_pos, )LINKS = dict(source = source,  target = target,  value = link_values,  label = link_labels,  color = link_colors, hovertemplate="%{label}",)data = go.Sankey(arrangement='snap',  node = NODES,  link = LINKS)fig = go.Figure(data)fig.update_traces(valueformat='3d', valuesuffix=' Medals', selector=dict(type='sankey'))fig.update_layout(title="Olympics - 2021: Country &Medals",font_size=16,width=1200,height=500,)fig.update_layout(hoverlabel=dict(bgcolor="grey", font_size=14, font_family="Rockwell"))fig.show("png")

怎么使用Python绘制惊艳的桑基图

“怎么使用Python绘制惊艳的桑基图”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

--结束END--

本文标题: 怎么使用Python绘制惊艳的桑基图

本文链接: https://www.lsjlt.com/news/357231.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 怎么使用Python绘制惊艳的桑基图
    本篇内容介绍了“怎么使用Python绘制惊艳的桑基图”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!桑基图简介很多时候,我们需要一种必须可视化...
    99+
    2023-07-06
  • Python绘制惊艳的桑基图的示例详解
    目录桑基图简介什么是桑基图如何绘制桑基图桑基图绘图基础调整节点位置和图表宽度添加有意义的悬停标签桑基图简介 很多时候,我们需要一种必须可视化数据如何在实体之间流动的情况。例如,以居民...
    99+
    2024-04-02
  • Python怎么使用pyecharts绘制桑基图
    本篇内容主要讲解“Python怎么使用pyecharts绘制桑基图”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Python怎么使用pyecharts绘制桑基图”吧!桑基图桑基图(Sankey ...
    99+
    2023-07-02
  • Matlab怎么绘制桑基图
    这篇文章主要为大家展示了“Matlab怎么绘制桑基图”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Matlab怎么绘制桑基图”这篇文章吧。这次主要是分享自己写的一个函数,用来绘制桑基图,效果大概...
    99+
    2023-06-29
  • Python 绘制桑基图全面解析
    目录前言题目再现题目拆解创建桑基图添加桑基图选项返回桑基图绘制完成的对象3.完整源码总结&后记大家好,我是执念斩长河,一个刚刚学习python绘图的学渣,今天愉快学习《pyt...
    99+
    2024-04-02
  • Python绘制惊艳的可视化动图的示例代码
    今天小编给大家介绍一款可视化模块,使用它可以绘制出十分惊艳的动图效果,那么当然第一步我们首先是要安装一下该模块,通过pip命令行来安装: pip install ipyvizzu 牛...
    99+
    2024-04-02
  • 用Python绘制了若干张词云图,惊艳了所有人
    在数据可视化图表中,词云图的应用随处可见。它通常是对输入的一段文字进行词频提取,然后以根据词汇出现频率的大小集中显示高频词,简洁直观高效,今天小编就来分享一下在Python如何绘制出来精湛的词云图。小试牛刀我们先来尝试绘制一张简单的词云图,...
    99+
    2023-05-14
    Python 词云图
  • Python可视化神器pyecharts绘制桑基图
    目录桑基图桑基图系列模板第一个桑基图复杂桑基图桑基图 桑基图(Sankey diagram),即桑基能量分流图,也叫桑基能量平衡图。它是一种特定类型的流程图,图中延伸的分支的宽度对应...
    99+
    2024-04-02
  • Python Pyecharts怎么绘制桑基图分析用户行为路径
    这篇文章主要介绍“Python Pyecharts怎么绘制桑基图分析用户行为路径”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Python Pyecharts怎么绘制桑基图分析用...
    99+
    2023-06-30
  • Python Pyecharts绘制桑基图分析用户行为路径
    目录读取数据生成节点数据组织数据:定义节点和流量数据可视化桑基图,它的核心是对不同点之间,通过线来连接。线的粗细代表流量的大小。很多工具都能实现桑基 图,比如:Excel、table...
    99+
    2024-04-02
  • 怎么使用python绘制火山图
    这篇文章主要讲解了“怎么使用python绘制火山图”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么使用python绘制火山图”吧!导入模块import numpy as...
    99+
    2023-07-02
  • 怎么使用python绘制雷达图
    这篇文章主要介绍了怎么使用python绘制雷达图,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。python有哪些常用库python常用的库:1.requesuts;2.scr...
    99+
    2023-06-14
  • Python中如何使用Seaborn绘制基线图
    这篇文章给大家分享的是有关Python中如何使用Seaborn绘制基线图的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。基线图本文中的脚本在python3.8.3中进行了测试。让我们使用Seaborn内置的peng...
    99+
    2023-06-26
  • 怎么使用Python的pyecharts绘制折线图
    本篇内容主要讲解“怎么使用Python的pyecharts绘制折线图”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么使用Python的pyecharts绘制折线图”吧!折线图介绍折线图和柱状图...
    99+
    2023-07-02
  • Python怎么使用pyecharts绘制漏斗图
    本文小编为大家详细介绍“Python怎么使用pyecharts绘制漏斗图”,内容详细,步骤清晰,细节处理妥当,希望这篇“Python怎么使用pyecharts绘制漏斗图”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧...
    99+
    2023-07-02
  • Python怎么使用pyecharts绘制箱形图
    这篇文章主要介绍“Python怎么使用pyecharts绘制箱形图”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Python怎么使用pyecharts绘制箱形图”文章能帮助大家解决问题。箱形图概念后...
    99+
    2023-07-02
  • 怎么使用Python Matplotlib绘制条形图
    今天小编给大家分享一下怎么使用Python Matplotlib绘制条形图的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一...
    99+
    2023-07-02
  • 怎么使用python scatter绘制散点图
    本文小编为大家详细介绍“怎么使用python scatter绘制散点图”,内容详细,步骤清晰,细节处理妥当,希望这篇“怎么使用python scatter绘制散点图”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一...
    99+
    2023-07-02
  • Python怎么使用pyecharts绘制雷达图
    本篇内容介绍了“Python怎么使用pyecharts绘制雷达图”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!雷达图雷达图是以从同一点开始的...
    99+
    2023-07-02
  • 怎么使用python进行图像绘制
    本文小编为大家详细介绍“怎么使用python进行图像绘制”,内容详细,步骤清晰,细节处理妥当,希望这篇“怎么使用python进行图像绘制”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。正文实际上前面我们就已经用到了...
    99+
    2023-07-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作