如何基于Label标签列生成对应词频的独立可视化分图?
问题原因
你使用的hist()是直方图接口,仅用于统计数值型数据的分布情况,和你需要的「分类单词对应频率的条形图」需求不匹配,所以输出不符合预期。
实现方案
给你两种可直接运行的实现方式:
方案1:仅用matplotlib实现
import pandas as pd import matplotlib.pyplot as plt # 获取所有唯一Label值,按你需要的展示顺序调整排序逻辑 label_list = sorted(df['Label'].unique()) # 生成1行3列的子图画布,可自行修改figsize参数调整整体尺寸 fig, axs = plt.subplots(1, 3, figsize=(16, 4)) for ax, label_val in zip(axs, label_list): # 筛选当前Label对应的数据集 group_df = df[df['Label'] == label_val] # 绘制条形图 ax.bar(group_df['Word'], group_df['Frequency']) # 设置子图基础样式 ax.set_title(f'Label = {label_val}') ax.set_xlabel('单词') ax.set_ylabel('频率') # 旋转x轴标签避免文字重叠 plt.setp(ax.get_xticklabels(), rotation=45, ha='right') # 自动调整子图间距 plt.tight_layout() plt.show()
方案2:用seaborn FacetGrid实现(代码更简洁)
import seaborn as sns import matplotlib.pyplot as plt # 按Label列生成分面子图 grid = sns.FacetGrid(df, col='Label', height=4, aspect=0.8) # 每个分面绘制条形图 grid.map(sns.barplot, 'Word', 'Frequency', color='steelblue') # 统一设置坐标轴标签和分面标题 grid.set_axis_labels('单词', '频率') grid.set_titles('Label = {col_name}') # 旋转x轴标签避免重叠 for ax in grid.axes.flat: plt.setp(ax.get_xticklabels(), rotation=45, ha='right') plt.tight_layout() plt.show()
补充说明
- 你的原始数据已经按Label分组做了Frequency降序排序,所以绘制出来的条形顺序和数据集顺序完全一致,不需要额外处理
- 如果需要调整分面布局为竖排,把
plt.subplots(1, 3)改成plt.subplots(3, 1),或者把FacetGrid的col参数改成row参数即可 - 可根据需要自定义柱子颜色、宽度、字体大小等样式,直接给
ax.bar或者sns.barplot传入对应参数即可
内容的提问来源于stack exchange,提问作者Math
相关产品推荐
相关产品推荐

