You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:24:40