基于Python的层级分类文档集类别分布可视化方案咨询
嘿,针对你这种带层级结构的类别标注数据集,我有几个非常实用的Python可视化方案,完全适配你的需求,咱们一个个来看:
1. 层级树状图(Treemap):展示类别父子关系+数量占比
这个方案最适合你的层级类别场景,能同时展示类别嵌套关系和每个类别的出现数量,一眼就能看出哪个主类别下的子类最活跃,占比多少。
实现步骤:
首先得统计所有类别的出现频次,然后构建层级映射(你的类别命名很有规律,比如M11的父类是MCAT,可以自动推断,或者手动定义),再用Plotly生成树状图。
import pandas as pd from collections import Counter import plotly.express as px # 你的示例数据 docs = [['M11', 'MCAT'], ['M13', 'M131', 'MCAT'], ['C15', 'C151', 'CCAT'], ['C24', 'CCAT'], ['C15', 'C152', 'CCAT'], ['GCAT'], ['C33', 'CCAT']] # 1. 统计所有类别出现频次 all_cats = [cat for doc in docs for cat in doc] cat_counts = Counter(all_cats) cat_df = pd.DataFrame.from_dict(cat_counts, orient='index', columns=['count']).reset_index().rename(columns={'index':'category'}) # 2. 自动推断层级关系(如果你的命名规则固定) def get_parent(cat): if cat.endswith('CAT'): return '总类别' # 根节点 # 提取前缀对应主类别,比如M11 → MCAT prefix = cat[0] return f"{prefix}CAT" cat_df['parent'] = cat_df['category'].apply(get_parent) # 3. 生成树状图 fig = px.treemap(cat_df, path=['parent', 'category'], values='count', color='count', color_continuous_scale='YlGnBu', title='类别层级分布与数量占比') fig.show()
优势:
- 直观展示层级嵌套+数量大小,适合汇报或快速全局查看
- 支持交互:鼠标悬停能看到具体数值
2. 类别频次条形图:快速对比各类别数量
如果你的核心需求是对比哪个类别出现次数最多,条形图是最直接的选择,还能按主类别分组,让同类别的子类放在一起比较。
import seaborn as sns import matplotlib.pyplot as plt # 按出现次数降序排序 cat_df_sorted = cat_df.sort_values('count', ascending=False) plt.figure(figsize=(10, 6)) sns.barplot(data=cat_df_sorted, x='count', y='category', hue='parent', palette='viridis') plt.title('各类别出现频次对比') plt.xlabel('出现次数') plt.ylabel('类别名称') plt.legend(title='主类别') plt.tight_layout() plt.show()
优势:
- 数值对比最清晰,排序后一目了然
- 代码简单,调试成本低
- 适合细节分析:比如能快速发现
CCAT下哪个子类出现次数最多
3. 桑基图(Sankey):展示类别共现关系
因为每个文档是一组类别集合,桑基图能完美展示类别之间的共现关联——比如MCAT常和哪些子类一起出现,CCAT的核心子类别是哪些,非常适合分析类别间的依赖关系。
from itertools import combinations import plotly.graph_objects as go # 统计两两类别共现的次数 co_occur_counts = Counter() for doc in docs: # 生成文档内所有两两不重复的类别组合 for pair in combinations(sorted(doc), 2): co_occur_counts[pair] += 1 # 转换成桑基图需要的格式 links_df = pd.DataFrame.from_dict(co_occur_counts, orient='index', columns=['value']).reset_index() links_df[['source', 'target']] = pd.DataFrame(links_df['index'].tolist(), index=links_df.index) links_df = links_df.drop('index', axis=1) # 构建节点映射(给每个类别分配ID) all_nodes = list(set(links_df['source'].tolist() + links_df['target'].tolist())) node_id_map = {node: idx for idx, node in enumerate(all_nodes)} links_df['source_id'] = links_df['source'].map(node_id_map) links_df['target_id'] = links_df['target'].map(node_id_map) # 绘制桑基图 fig = go.Figure(data=[go.Sankey( node=dict( pad=15, thickness=20, line=dict(color="black", width=0.5), label=all_nodes, color="lightblue" ), link=dict( source=links_df['source_id'], target=links_df['target_id'], value=links_df['value'], color="rgba(100,100,200,0.3)" ) )]) fig.update_layout(title_text="类别共现关系桑基图", font_size=12) fig.show()
优势:
- 直观展示类别间的关联强度(线条越粗,共现次数越多)
- 交互性强,能清晰看到哪些类别总是成对出现
4. 层级旭日图(Sunburst):更有层次感的层级展示
和树状图类似,但旭日图用环形结构展示层级,视觉上更有冲击力,适合突出展示主类别的占比,以及每个主类别下子类的分布。
fig = px.sunburst(cat_df, path=['parent', 'category'], values='count', color='count', hover_data=['count'], title='类别层级旭日图', color_continuous_scale='OrRd') fig.show()
优势:
- 环形结构更美观,适合做可视化报告
- 层级嵌套关系更突出,能快速看到主类别的整体占比
额外提示:
如果你的类别命名没有这么规律(比如无法自动推断父类),可以手动构建一个父类映射字典,比如:
parent_map = { 'M11': 'MCAT', 'M13': 'MCAT', 'M131': 'M13', 'C15': 'CCAT', 'C151': 'C15', 'C152': 'C15', # ... 其他类别映射 } cat_df['parent'] = cat_df['category'].map(parent_map).fillna('总类别')
内容的提问来源于stack exchange,提问作者Markos di Mitsas
相关产品推荐
相关产品推荐

