Matplotlib如何将图表X轴按token长度升序重新排序?
修改Token长度频率分布图表的X轴为升序排列
原函数使用nltk.FreqDist.plot()时,X轴默认按token长度的出现频率降序排列,要改成固定按2、3、4、5、6的升序展示,我们可以手动指定目标长度范围,统计对应频率后用matplotlib原生方法绘图,确保不同文本的图表X轴一致,方便对比。
修改后的composition函数代码
import matplotlib.pyplot as plt import nltk def composition(tokens, title): '''生成语料库的token长度组成曲线,X轴按2、3、4、5、6升序排列''' token_lengths = [len(token) for token in tokens] # 指定要展示的token长度范围,固定为2-6升序 target_lengths = [2, 3, 4, 5, 6] # 统计每个目标长度的出现次数 length_counts = [token_lengths.count(length) for length in target_lengths] fig = plt.figure() plt.gcf().subplots_adjust(bottom=0.15) # 使用matplotlib原生柱状图绘图,完全控制X轴顺序 plt.bar(target_lengths, length_counts, width=0.8) # 若需要折线图,可替换为:plt.plot(target_lengths, length_counts, marker='o') plt.title(f'{title}') plt.xlabel('Token长度') plt.ylabel('出现次数') # 强制X轴刻度为指定的长度值,确保顺序固定 plt.xticks(target_lengths) plt.show() fig.savefig(f'{title}.png')
配套的tokenize函数(无需修改)
def tokenize(text, language): '''对给定文本进行分词,返回过滤后的token列表''' tokens = nltk.word_tokenize(text=text.lower(), language=f"{language}") # 过滤掉不含字母的token(移除标点等非单词内容) tokens = ([token for token in tokens if any(c.isalpha() for c in token)]) return tokens
关键改动说明
- 新增
target_lengths固定要展示的长度范围,确保不同文本的图表X轴完全一致 - 手动统计每个目标长度的出现次数,摆脱
FreqDist.plot()默认的频率排序逻辑 - 使用matplotlib原生绘图方法,完全控制X轴的显示顺序
- 添加X/Y轴标签,让图表信息更直观清晰
内容的提问来源于stack exchange,提问作者KWunsch
相关产品推荐
相关产品推荐

