局部整体(五)利用python绘制旭日图

局部整体(五)利用python绘制旭日图

旭日图( Sunburst Charts)简介

1

由于其形状像太阳光由内向外辐射出来,所以叫SunBurst(太阳爆发),中文也叫日出图。是多个层级的环图/饼图的拓展,可以显示多个层级的整体分布关系。

快速绘制

  1. 基于plotly

    # 基于plotly.express(自定义程度低,代码量较少)
    
    import plotly.express as px
    import numpy as np
    
    df = px.data.gapminder().query("year == 2007")
    fig = px.sunburst(df, path=['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.show()
    

    1

定制多样化的圆环图

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

基于plotly.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 '', 
                               })
        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.Sunburst(
    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()

3

总结

以上利用plotly的express模块快速绘制旭日图,也通过plotly的graph_objects更为灵活的自定义旭日图。

共勉~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值