局部整体(一)利用python绘制矩形树图
矩形树图( Treemap)简介
矩形树图利用嵌套式矩形来显示层次结构,同时通过面积大小显示每个类别的数量。因此每个类别会分配给一个矩形区域,而其子类别则由嵌套在其中的小矩形表示。由于其紧凑且节省空间的显示方式,可以让人快速了解分类数据的结构;其大小也方便用来比较类别之间的比例。
快速绘制
-
基于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()
-
基于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()
定制多样化的矩形树图
自定义矩形树图一般是结合使用场景对相关参数进行修改,并辅以其他的绘图知识。参数信息可以通过官网进行查看,其他的绘图知识则更多来源于实战经验,大家不妨将接下来的绘图作为一种学习经验,以便于日后总结。
-
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()
-
基于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()
总结
以上通过squarify和plotly快速绘制矩形树图,并且可以利用plotly的graph_objects
更为灵活的绘制独具风格的矩形树图。
共勉~