局部整体(一)利用python绘制矩形树图

局部整体(一)利用python绘制矩形树图

矩形树图( Treemap)简介

1

矩形树图利用嵌套式矩形来显示层次结构,同时通过面积大小显示每个类别的数量。因此每个类别会分配给一个矩形区域,而其子类别则由嵌套在其中的小矩形表示。由于其紧凑且节省空间的显示方式,可以让人快速了解分类数据的结构;其大小也方便用来比较类别之间的比例。

快速绘制

  1. 基于squarify

    import pandas as pd
    import matplotlib.pyplot as plt
    import squarify 
     
    # 利用squarify快速绘制
    squarify.plot(sizes=[13,22,35,5], label=["group A", "group B", "group C", "group D"], alpha=.7 )
    plt.axis('off')
    
    plt.show()
    

    2

  2. 基于plotly

    # 基于plotly.express(自定义程度低,代码量较少)
    
    import plotly.express as px
    import numpy as np
    
    df = px.data.gapminder().query("year == 2007")
    
    # 利用treemap快速绘制
    fig = px.treemap(df, path=[px.Constant("world"), 'continent', 'country'], values='pop',
                      color='lifeExp', hover_data=['iso_alpha'],
                      color_continuous_scale='RdBu',
                      color_continuous_midpoint=np.average(df['lifeExp'], weights=df['pop']))
    fig.update_layout(margin = dict(t=50, l=25, r=25, b=25))
    
    fig.show()
    

    3

定制多样化的矩形树图

自定义矩形树图一般是结合使用场景对相关参数进行修改,并辅以其他的绘图知识。参数信息可以通过官网进行查看,其他的绘图知识则更多来源于实战经验,大家不妨将接下来的绘图作为一种学习经验,以便于日后总结。

  1. squarify自定义颜色

    更多用法可参考Treemaps in Python with squarify

    import matplotlib.pyplot as plt
    import squarify
     
    # 自定义颜色
    squarify.plot(sizes=[13,22,35,5], label=["group A", "group B", "group C", "group D"]
                      , color=["red","green","blue", "grey"], alpha=.4 )
    plt.axis('off')
    
    plt.show()
    

    4

  2. 基于plotly.graph_objects

    plotly一般可以用express和graph_objects绘图。区别在于express一般是封装好的代码,能够快速绘制出相关图形,但是自定义程度较低;graph_objects则更具灵活性,缺点就是代码复杂度较高。

    # 基于plotly.graph_objects(自定义程度高,代码量较大)
    
    import plotly.graph_objects as go
    import plotly.express as px
    import pandas as pd
    import numpy as np
    
    df = px.data.gapminder().query("year == 2007")
    
    def build_tree(df, levels, value_columns):
        '''
        将df多层级数据转化为两列,分别表示自节点(label)和父节点(parent)。value_columns为统计值(不同层级汇总后的值)
        '''
        dfs = []  # 临时存储的df列表
        for i, level in enumerate(levels):
            dfg = df.groupby(levels[i:]).agg(value_columns).reset_index()
            df_level = pd.DataFrame({'label': dfg[level], 
                                     'parent': dfg[levels[i + 1]] if i + 1 < len(levels) else 'world', 
                                   })
            for value_column in value_columns.keys():
                df_level[value_column] = dfg[value_column]
            dfs.append(df_level)
    
        df_tree = pd.concat(dfs, ignore_index=True)
        return df_tree
    
    levels = ['country','continent']
    # 这里对lifeExp只做简单的平均,plotly.express里的color是按照value作为权重进行加权平均计算的
    value_columns = {'pop': 'sum', 'lifeExp': 'mean'} 
    df_tree = build_tree(df, levels, value_columns)
    
    fig =go.Figure(go.Treemap(
        labels=df_tree['label'],
        parents=df_tree['parent'],
        values=df_tree['pop'],
        branchvalues="total",
        hovertext=df['pop'],
        marker=dict(
            colors=df_tree['lifeExp'], 
            colorscale='RdBu',
            cmid=np.average(df['lifeExp'], weights=df['pop']),
            colorbar=dict(
                  title='LifeExp'
            )    
        ),
        hovertemplate='<b>%{label} </b> <br> Pops: %{value}<br> lifeExp: %{color:.2f}',
    ))
    fig.update_layout(margin = dict(t=0, l=0, r=0, b=0))
    
    fig.show()
    

    5

总结

以上通过squarify和plotly快速绘制矩形树图,并且可以利用plotly的graph_objects更为灵活的绘制独具风格的矩形树图。

共勉~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值