python_0">局部整体(五)利用python绘制旭日图
旭日图( Sunburst Charts)简介
由于其形状像太阳光由内向外辐射出来,所以叫SunBurst(太阳爆发),中文也叫日出图。是多个层级的环图/饼图的拓展,可以显示多个层级的整体分布关系。
快速绘制
-
基于plotly
python"># 基于plotly.express(自定义程度低,代码量较少)import plotly.express as px import numpy as npdf = 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
可以自定义更为灵活的旭日图
python"># 基于plotly.graph_objects(自定义程度高,代码量较大)import plotly.graph_objects as go
import plotly.express as px
import pandas as pd
import numpy as npdf = 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_treelevels = ['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
更为灵活的自定义旭日图。
共勉~