数据可视化--分布和流转

本文介绍了箱线图和桑基图两种数据可视化工具。箱线图用于展示数据的分布情况,通过箱子的长度和中位数的位置揭示数据差异和密集程度。桑基图则擅长展示数据的流向和比例关系,如业务流程中的转换和类别依赖。在Python中,可以使用pyecharts库来绘制这两种图形,通过设置不同的参数调整图的样式和细节。
摘要由CSDN通过智能技术生成

一、箱线图

用于描述一组数据的分布情况。组成如下:

说明:

①当箱子较短时,表示数据差别不大,数据都分布在较小的范围内。

当箱子较长时,表示数据差别很大,数据都分布在较大的范围内。

②当中位数接近箱子底部(下四分位数)时,说明在更小的区间内数字分布更密集。

当中位数接近箱子顶部(上四分位数)时,说明在更大的区间内数字分布更密集。

③如果“须”很长,表示数据分布分散;如果一边“须”很长,另一边较短,表示数据在一个方向分散。

绘制

#使用from...import从pyecharts.charts导入Boxplot
from pyecharts.charts import Boxplot

# 创建二维列表data_list
data_list = [[2, 9, 13, 15, 18, 13, 10, 8, 18, 14]]

# 使用Boxplot()创建实例赋值给boxplot
boxplot = Boxplot()

# 使用prepare_data()计算数据,赋值给data
data = boxplot.prepare_data(data_list)

# 使用add_xaxis()设置横坐标,xaxis_data=["袜子"]
boxplot.add_xaxis(xaxis_data=["袜子"])

# 使用add_yaxis()设置纵坐标
# series_name为空,y_axis=data
boxplot.add_yaxis(series_name="", y_axis=data)

# 使用render()生成文件保存到/Users/panpan/boxplot.html
boxplot.render("/Users/panpan/boxplot.html")

注意:

箱线图的y轴需要传入二维列表,样式为[[第1组],[第2组],...]。列表中可传入一组或多组数据,当列表中传入多组数据时,就生成绘制多个箱线图的数值。

使用pyecharts.charts模块中的prepare_data()函数计算出数值列表,计算出的数据以二维列表的形式返回,列表中的没想的含义是:[[min,Q1,median,Q3,max]]

二、桑基图

能够展现某个事物经过多个过程而变为最终的目标结果,包括中间的转换过程和每个过程的比例,能够体现数据的流向。

组成部分:

桑基图最擅长的表现是:

①业务数据的流动,比如:页面流转、物流、资金流、航线客流等等这种从一个地方、类别到另外一个地方、类别的流量移动。

②类别依存关系,比如:某个业务中,某个大类以及小类之间的业务关系或大类销售中,小类的比例等。

  1. 节点流(nodes)和信息流(links)的结构

①列表的元素都是字典元素;

②nodes列表中的每个字典元素只包含一对键:值,键(key)都为“name”;

naodes = [{"name":"标签名1"},{"name":"标签名2"},...]

③links列表中的每个字典元素包含三对键:值,键(key)为“source”、“target”、“value”

信息流连接的源节点的标签名为“source”对应的值;

目标节点的标签名为“target”对应的值;

信息流的宽度为“value”对应的值,即:

links = [{"source":"标签名1","target":"标签名2","value":"值1"},

{"source":"标签名1","target":"标签名3","value":"值2"},......]

  1. 列表元素去重

#set()函数用于删除重复数据和元素,返回值为无序不重复的元素集合。
# 使用set()函数对list_labels去重
# 使用list()函数对去重后的结果转化为列表
# 赋值给变量list_nodes
list_nodes = list(set(list_labels))

3.桑基图代码框架

注:调用gen_nodesandlinks()函数,(nodes,links)的结果是以元组的形式返回,调用函数:nodes_links = gen_nodesandlinks(sheet),那么,将返回结果索引为0和1的列表分别赋值给nodes和links,就得到了节点和信息流列表:nodes = nodes_links[0] links = nodes_links[1]

4.初始化配置项--背景颜色

#初始化配置项需要使用pyecharts中的options模块,并简写为opts。
from pyecharts import options as opts

#在pyecharts中,对于图例主题可以设置图例初始化配置项init_opts=opts.InitOpts(),其中可设置的参数有:
#1.主题:theme,主题设置为dark。
#2.背景颜色:bg_color,背景色设置成#253441。
sankey = Sankey(init_opts=opts.InitOpts(theme="dark",bg_color="#253441"))

5.线样式基本配置项

#在pyecharts中,对于信息流样式可以设置线样式配置项linestyle_opt=opts.LineStyleOpts(),其中可设置的参数有:
#1.透明度:opacity,透明度设置为0.3。
#2.弯曲度:curve,弯曲度设置为0.5。
#3.颜色:color,颜色设置为source。
#color设置成source表示信息流的颜色与源节点一致,设置成target表示与目标节点颜色一致。
sankey.add("sankey",
        nodes=nodes_links[0],
        links=nodes_links[1],
        # 使用LineStyleOpts(),传入参数opacity=0.3, curve=0.5, color="source",赋值给linestyle_opt 
        linestyle_opt=opts.LineStyleOpts(opacity=0.3, curve=0.5, color="source"))

6.标签基本配置项

#在pyecharts中,对于标签可以设置标签配置项label_opts=opts.LabelOpts(),其中可设置的参数有:
#1.位置:position,位置设置为right,也就是节点的右侧。
#2.颜色:color,颜色设置为#ffffff,也就是白色;
#3.字体大小:font_size,字体大小设置为10。
sankey.add("sankey",
        nodes=nodes_links[0],
        links=nodes_links[1],
        # 使用LineStyleOpts(),传入参数opacity=0.3, curve=0.5, color="source",赋值给linestyle_opt 
        linestyle_opt=opts.LineStyleOpts(opacity=0.3, curve=0.5, color="source"),
        # 使用LabelOpts(),传入参数position="right",color="#ffffff",font_size=10,赋值给label_opts
        label_opts=opts.LabelOpts(position="right",color="#ffffff",font_size=10)
        )

总结使用:

# 使用import导入openpyxl模块
import openpyxl
# 使用from...import从pyecharts.charts导入Sankey
from pyecharts.charts import Sankey
# 使用from...import从pyecharts导入options,简写为opts
from pyecharts import options as opts

# 使用openpyxl.load_workbook(path)读取文件,赋值给wb
wb = openpyxl.load_workbook("/Users/panpan/sankey.xlsx")
# 使用中括号读取工作表对照组和实验组,赋值给sheet_A,sheet_B
sheet_A = wb["对照组"]
sheet_B = wb["实验组"]

# 定义函数gen_nodesandlinks(),传入参数sheet
def gen_nodesandlinks(sheet):
    # 定义标签数据列表,赋值给变量list_labels
    list_labels = []
    # 定义信息流列表,赋值给变量links
    links = []
    # 通过for循环,读取sheet2-24行数据
    for row in sheet[2:24]:
        # .value属性获取元组索引为0的单元格值,并用append()函数添加进list_labels
        list_labels.append(rowl[0].value)
        # .value属性获取元组索引为0的单元格值,并用append()函数添加进list_labels
        list_labels.append(row[1].value)
        # 定义字典,赋值给变量dic
        dic = {}
        # .value属性获取元组索引为0的单元格值,为dic创建("source":"标签名1")键:值对
        dic["source"] = row[0].value
        # .value属性获取元组索引为1的单元格值,为dic创建("target":"标签名2")键:值对
        dic["target"] = row[1].value
        # .value属性获取元组索引为2的单元格值,为dic创建("value":值)键:值对
        dic["value"] = row[2].value
        # 使用append()函数将dic添加进links
        links.append(dic)

    # 使用set()函数对list_labels去重
    # 使用list()函数对去重后的结果转化为列表
    # 赋值给变量list_nodes
    list_nodes = list(set(list_labels))

    # 定义节点列表,赋值给变量nodes
    nodes = []
    # 通过for循环遍历list_labels
    for i in list_nodes:
        # 定义字典,赋值给变量dic
        dic = {}
        # 为dic创建("name":"标签名")键:值对
        dic["name"] = i
        # 使用append()函数将dic添加进nodes
        nodes.append(dic)

    # 使用return返回(nodes,links)
    return (nodes,links)

# 使用Sankey()函数创建对象赋值给sankey
# 使用InitOpts(),传入参数theme="dark",bg_color="#253441",赋值给init_opts
#主题:theme,主题设置为dark。背景颜色:bg_color,背景色设置成#253441。
sankey = Sankey(init_opts=opts.InitOpts(theme="dark",bg_color="#253441"))

# 传入sheet_A参数调用gen_nodesandlinks(),赋值给变量nodes_links
nodes_links = gen_nodesandlinks(sheet_A)

# 为创建的实例增加图例名称"sankey"、传入节点和信息流列表
sankey.add(series_name = "sankey",
        nodes=nodes_links[0],
        links=nodes_links[1,
        # 使用LineStyleOpts(),传入参数opacity=0.3, curve=0.5, color="source",赋值给linestyle_opt 
        linestyle_opt=opts.LineStyleOpts(opacity=0.3, curve=0.5, color="source")],
        # 使用LabelOpts(),传入参数position="right",color="#ffffff",font_size=10,赋值给label_opts
        label_opts=opts.LabelOpts(position="right",color="#ffffff",font_size=10)
        )

# 使用TitleOpts(),传入参数title,赋值给title_opts
# 使用LegendOpts(),传入参数is_show=False,赋值给legend_opts 
# 调用set_global_opts()
sankey.set_global_opts(title_opts=opts.TitleOpts(title="用户路径图"),legend_opts=opts.LegendOpts(is_show=False))

# 使用render()生成桑基图保存到/Users/panpan/sankey.html
sankey.render("/Users/panpan/sankey.html")
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值