局部整体(五)利用python绘制旭日图
旭日图( Sunburst Charts)简介
由于其形状像太阳光由内向外辐射出来,所以叫SunBurst(太阳爆发),中文也叫日出图。是多个层级的环图/饼图的拓展,可以显示多个层级的整体分布关系。
快速绘制
-
基于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()
定制多样化的圆环图
自定义旭日图一般是结合使用场景对相关参数进行修改,并辅以其他的绘图知识。参数信息可以通过官网进行查看,其他的绘图知识则更多来源于实战经验,大家不妨将接下来的绘图作为一种学习经验,以便于日后总结。
基于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()
总结
以上利用plotly的express
模块快速绘制旭日图,也通过plotly的graph_objects
更为灵活的自定义旭日图。
共勉~