目录

1. 旭日图的特点

1.1 层级结构展示

1.2 数据比例表达

1.3 直观的层次关系

1.4 交互性(在现代工具中)

1.5 对比于其他图表

2. 旭日图适用场景

2.1 组织结构分析

2.2 财务报表分析

2.3 网站流量分析

2.4 产品分类销售数据

2.4 服务器资源管理

2.5 软件系统分析

3. 旭日图局限性

4. 旭日图代码实现

4.1 Python 代码实现

4.2 旭日图效果(网页实现)

4.3 旭日图数据展示注意事项

4.3.1 数据完整且对称

4.3.2 容易出错的参数


1. 旭日图的特点

        旭日图(Sunburst Chart),也被称为太阳图或多层饼形图,是饼图的一种变体,能够清晰地展示数据的层次结构。它通过分层的环形结构,直观地展示数据的树状关系以及各层级的占比。

        旭日图的主要特点:

1.1 层级结构展示

  • 旭日图的中心表示根节点,外层环形区域表示子节点。数据越靠外层,层级越深。
  • 各层环形区域根据数据的父子关系排列,可以直观理解数据的层级结构。

1.2 数据比例表达

  • 各区域的角度或面积大小反映该节点的值或占比。
  • 更大的角度或面积表示更大的数据量。

1.3 直观的层次关系

  • 使用色彩区分不同的分支或层级,便于区分和理解。
  • 每个节点的颜色和外层子节点之间通常存在关联性。

1.4 交互性(在现代工具中)

  • 通过悬停、点击或筛选等交互操作,可以动态显示某个层次的详细信息。
  • 部分工具支持动态展开某个层级或只显示特定分支。

1.5 对比于其他图表

  • 与树图(TreeMap):
    • 树图用矩形展示层级,面积大小反映占比,而旭日图用环形结构。
  • 与饼图(Pie Chart):
    • 饼图通常仅显示一层数据,而旭日图可以展示多层级数据。
  • 与桑基图(Sankey Diagram):
    • 桑基图强调流量和转化,而旭日图更专注于层级和比例。

2. 旭日图适用场景

        旭日图适用于需要展示多级分类数据树状结构数据的场景,例如:

2.1 组织结构分析

        在分析公司的组织结构和资源分配情况时,旭日图可以直观地展示公司的层级关系。

        例如,从公司整体出发,第一层圆环可以按照不同的部门划分扇区,表示各部门的资源占比,第二层圆环则可以进一步展示每个部门内部的资源细分情况。

2.2 财务报表分析

        旭日图能够清晰地表达具有父子层次结构类型的数据,适用于分析财务报表的层次结构。

        它可以从总营业收入开始,按照不同的业务部门、产品类型、成本项目等层次分解财务数据,使财务人员和管理层能够直观地看到财务数据的构成和各部分的占比情况,便于进行成本控制和利润分析。

2.3 网站流量分析

        在分析网站的页面浏览路径时,旭日图可以展示从首页到各个子页面,再到更深层次页面的流量分布情况。

        这有助于网站管理者了解用户的浏览层次和主要浏览路径,从而优化网站结构和提升用户体验。

2.4 产品分类销售数据

        在展示产品分类的多层级销售数据时,旭日图能够将多个层次的产品类别有序地呈现在一个圆形区域内,用户可以方便地观察到各个层次的数据情况,有助于制定更精准的销售策略。

2.4 服务器资源管理

        在数据中心管理中,旭日图可以展示服务器的存储资源或计算资源的分配情况。从数据中心整体开始,按照服务器集群、单个服务器、存储设备等层次展示资源占用情况,帮助管理员了解资源的分配是否合理,以及各个层次的资源使用效率。

2.5 软件系统分析

        对于复杂的软件系统,旭日图可以展示系统的模块结构和代码层次。从整个软件系统开始,按照模块、子模块、函数等层次展示代码量或功能复杂度等数据,帮助开发人员理解系统架构和进行代码维护。

3. 旭日图局限性

  • 当层级较多或数据过多时,外层可能变得难以辨认。
  • 节点的区域大小和角度可能导致某些小区域不易观察。

4. 旭日图代码实现

4.1 Python 代码实现

        Dash 是一个非常好用的模块!!!

import dash
from dash import html, dcc
import plotly.graph_objects as go


def create_colored_sunburst():
    labels = ["公司", "研发部", "市场部", "销售部", "前端", "后端", "测试", "国内", "海外", "直销", "渠道"]
    parents = ["", "公司", "公司", "公司", "研发部", "研发部", "研发部", "市场部", "市场部", "销售部", "销售部"]
    values = [100, 30, 30, 40, 10, 10, 10, 15, 15, 20, 20]
    colors = ['rgb(150, 150, 150)', 'rgb(200, 150, 150)', 'rgb(150, 200, 150)', 'rgb(150, 150, 200)',
              'rgb(200, 200, 150)', 'rgb(150, 200, 200)', 'rgb(200, 150, 200)', 'rgb(200, 200, 200)',
              'rgb(150, 150, 150)', 'rgb(200, 150, 150)', 'rgb(150, 200, 150)']

    colored_sunburst = go.Figure(go.Sunburst(
        labels=labels,
        parents=parents,
        values=values,
        marker=dict(colors=colors),
        branchvalues="total"
    ))
    colored_sunburst.update_layout(
        title='组织架构分析',
        template='plotly_white'
    )

    return colored_sunburst
def create_dynamic_sunburst():
    labels = ["公司", "研发部", "市场部", "销售部", "前端", "后端", "测试", "国内", "海外", "直销", "渠道"]
    parents = ["", "公司", "公司", "公司", "研发部", "研发部", "研发部", "市场部", "市场部", "销售部", "销售部"]
    values = [100, 30, 30, 40, 10, 10, 10, 15, 15, 20, 20]
    colors = ['rgb(150, 150, 150)', 'rgb(200, 150, 150)', 'rgb(150, 200, 150)', 'rgb(150, 150, 200)',
              'rgb(200, 200, 150)', 'rgb(150, 200, 200)', 'rgb(200, 150, 200)', 'rgb(200, 200, 200)',
              'rgb(150, 150, 150)', 'rgb(200, 150, 150)', 'rgb(150, 200, 150)']

    dynamic_sunburst = go.Figure(go.Sunburst(
        labels=labels,
        parents=parents,
        values=values,
        marker=dict(colors=colors),
        branchvalues="total"
    ))
    dynamic_sunburst.update_layout(
        title='动态组织架构分析',
        template='plotly_white',
        updatemenus=[{
            'buttons': [
                {
                    'args': [{'rotation': [0]}],
                    'label': '重置视图',
                    'method': 'restyle'
                },
                {
                    'args': [{'rotation': [90]}],
                    'label': '旋转90°',
                    'method': 'restyle'
                },
                {
                    'args': [{'rotation': [180]}],
                    'label': '旋转180°',
                    'method': 'restyle'
                }
            ],
            'direction': 'down',
            'showactive': True,
            'x': 0.1,
            'y': 1.1,
            'xanchor': 'left',
            'yanchor': 'top'
        }]
    )

    return dynamic_sunburst


app = dash.Dash(__name__)

app.layout = html.Div([
    dcc.Graph(figure=create_colored_sunburst()),
    dcc.Graph(figure=create_dynamic_sunburst())
])

if __name__ == "__main__":
    app.run_server(debug=True, port=8051)

4.2 旭日图效果(网页实现)

        动态架构支持调整旭日图基本布局。

4.3 旭日图数据展示注意事项

4.3.1 数据完整且对称
    colored_sunburst = go.Figure(go.Sunburst(
        labels=labels,
        parents=parents,
        values=values,
        marker=dict(colors=colors),
        branchvalues="total"
    ))

在创建旭日图时候,有三个列表一定要注意个数是一模一样的,并且值之间有正确的关系。

第一:labels 这个列表存储旭日图中每个最小元素

第二:parents 这个列表存储旭日图每个最小元素的父节点,其中肯定有一个是“”,用来指示整个图形中的根节点的父节点。

第三:values 这个列表中存储每个元素的值,父节点的值应该是大于等于所有子节点之和的,否则会有错误。

第四:colors 如果要指定每个元素的颜色,那么这个数量也必须和元素个数一致。个人建议,可以使用默认颜色配置,则不需要配置该参数了。

4.3.2 容易出错的参数

        当 branchvalues="total",则意味着旭日图中每个父节点和子节点之间是完整对应的关系,比如父节点销量 100,则对应的两个子节点线下销量+线上销量必须等于100,否则也会出错。如果数据不是完整对应的,建议不要使用 branchvalues="total"。

Logo

永洪科技,致力于打造全球领先的数据技术厂商,具备从数据应用方案咨询、BI、AIGC智能分析、数字孪生、数据资产、数据治理、数据实施的端到端大数据价值服务能力。

更多推荐