今天的Python培训,我们主要讲一下桑基图。桑基图亦称为桑基能量分流图、桑基能量平衡图,是一种特定类型的流程图,用于展示数据的“流动”变化。桑基图中包含若干条从左到右延展的分支,每条分支的宽度代表着数据流量的大小,且所有主支宽度的总和等于所有分支宽度的总和,常见于能源、材料成分等场景或金融领域。
matplotlib.sankey模块中专门提供了表示桑基图的类Sankey,通过创建Sankey类的对象可以创建桑基图,之后可以调用add()方法为桑基图添加一些配置选项,最后调用finish()方法完成桑基图的绘制。
假设现在小明家日常生活的开支主要分为工资、副业、生活、购物、深造、运动、其他和买书几类,且其中每项投入或产出值分别为0.7、0.3、-0.3、-0.1、-0.3、-0.1、-0.1、-0.1。
下面结合这些日常生活开支的数据绘制一个桑基图,示例代码如下。
import matplotlib.pyplot as plt
from matplotlib.sankey import Sankey
plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False
# 消费收入与支出数据
flows = [0.7, 0.3, -0.3, -0.1, -0.3, -0.1, -0.1, -0.1]
# 流的标签列表
labels = ["工资", "副业", "生活", "购物", "深造", "运动", "其他", "买书"]
# 流的方向
orientations = [1, 1, 0, -1, 1, -1, 1, 0]
sankey = Sankey()
# 为桑基图添加数据
sankey.add(flows=flows, # 收入与支出数据
labels=labels, # 数据标签
orientations=orientations, # 标签显示的方向
color="black", # 边缘线条颜色
fc="lightgreen", # 填充颜色
patchlabel="生活消费", # 图表中心的标签
alpha=0.7) # 透明度
# 桑基图绘制完成的对象
diagrams = sankey.finish()
diagrams[0].texts[4].set_color("r") #将下标为4的数据标签设为红色
diagrams[0].texts[4].set_weight("bold") #将下标为4的数据标签设为字体加粗
diagrams[0].text.set_fontsize(20) #将中心标签的字体大小设为20
diagrams[0].text.set_fontweight("bold") #将中心标签的字体设为加粗
plt.title("日常生活开支的桑基图")
plt.show()
运行程序,效果如图8-18所示。
图8-18 日常生活开支的桑基图
图8-18中,桑基图的各个分支代表生活消费的每个选项,其中分支末端呈内凹形状的分支代表收入的数据,呈箭头形状的分支代表支出的数据。由图8-18可知,工资和副业这2个选项代表的分支均属于生活消费的收入数据,其余选项的分支均属于生活消费的支出数据,且深造选项的支出最多。