#在写代码时想到还没有将统计好的词频进行数据可视化,心血来潮写下了这一篇文章,也是第一篇,有不足之处诚请批评指正!
1获取数据。
import re
数据的来源有很多,可以从网上使用爬虫爬取,也可以是实验获得的数据,本文摘抄了几段文字来进行粗略的词频统计.然后将文本读取出来
with open('小短文.','r',encoding='utf-8')as f:
text=f.read()
2数据加工。
将获得数据进行加工,去除多余的字符和标点符号保证其美观.本文使用了正则匹配来进行过滤
text=re.sub('^[\w\s]','',text)
text=text.replace(',',' ')
text=text.replace('。',' ')
3.统计词频
先创建一个列表用来存放要统计的词,再创建一个空字典,将词作为键,词频作为值放入字典中,用循环来实现。最后按照词频进行降序排序
count_list=['我','美食','天空','环境','美好','感受','湖','享受','的','彩色','上','鸟']#要统计的词
d={}#创建一个空字典
for i in range(len(count_list)):
matches = re.findall(count_list[i], text)#利用正则找到所有词,返回列表
d[m[i]]=len(matches)#获取词的长度,也就是词频
sorted_counts=sorted(d.items(),key=lambda x:x[1],reverse=True)#降序排序
4.绘制词频直方图
绘制词频直方图需要导入中文字体包,不然可能会报错,词不能显示.由于每个词出现的次数可能会有较大差异导致直方图纵坐标不能显示所有词频的值,因此需要遍历每个直方图将值添加上去
import matplotlib.font_manager as fm
import matplotlib.pyplot as plt#字体包
font_list = fm.findSystemFonts()#调用系统字体包
plt.rcParams['font.sans-serif'] = 'SimHei'#字体设为中文黑体
#使用plt.text()函数来添加值
key,value=zip(*sorted_counts)#将键和值存入两个列表,一个列表包含所有的键,另一个包含所有的值
figsize,axs=plt.subplots()#设置画板
bars=axs.bar(key,value,color='skyblue')#创建直方图对象
for bar in bars:
height = bar.get_height()
axs.text(bar.get_x() + bar.get_width() / 2, height, str(height), ha='center', va='bottom')#遍历每个个直方图将词频绘制到直方图上
plt.title('词频统计')
plt.xlabel('关键词')
plt.ylabel('频率')
plt.show()
text函数参数如下:
bar.get_x() + bar.get_width() / 2
计算每个条形的中心位置。height
为条形的高度。str(height)
将高度值转换为字符串,以便作为标签。ha='center'
表示水平居中对齐。va='bottom'
表示垂直对齐到条形的顶部。
结果如图:
这样数据看起来就比较直观,如果想看数据分布比例可以绘制饼状图
5.绘制饼状图
sizes=value
colors = ['#ff9999','#66b3ff','#99ff99','#ffcc99','#c2c2f0','#ffb3e6', '#c4e17f', '#76d7c4', '#f7b7a3', '#82e0aa', '#f9e79f', '#fad7a0']#颜色值
explode = [0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1]#将各部分比例凸显出来
plt.pie(sizes, explode=explode, labels=key, colors=colors, autopct='%1.1f%%',
shadow=True, startangle=140)#使用plt.pie()函数绘制饼状图
plt.title('词频饼状图')
plt.axis('equal') #确保绘制的是圆形
plt.show()
plt.pie()参数值如下:
sizes
:每个部分的值。explode
:指定哪个部分需要突出显示。labels
:每个部分的标签。colors
:每个部分的颜色。autopct
:自动显示每个部分的百分比。shadow
:是否显示阴影。-
startangle
:起始角度
结果如下:
完整代码:
import re
import matplotlib.font_manager as fm
import matplotlib.pyplot as plt
with open('小短文.','r',encoding='utf-8')as f:
text=f.read()
text=re.sub('^[\w\s]','',text)
text=text.replace(',',' ')
text=text.replace('。',' ')
# print(text)
count_list=['我','美食','天空','环境','美好','感受','湖','享受','的','彩色','上','鸟']
d={}
for i in range(len(count_list)):
matches = re.findall(count_list[i], text)
d[m[i]]=len(matches)
sorted_counts=sorted(d.items(),key=lambda x:x[1],reverse=True)
font_list = fm.findSystemFonts()
plt.rcParams['font.sans-serif'] = 'SimHei'
key,value=zip(*sorted_counts)
figsize,axs=plt.subplots()
#绘制直方图
bars=axs.bar(key,value,color='skyblue')
for bar in bars:
height = bar.get_height()
axs.text(bar.get_x() + bar.get_width() / 2, height, str(height), ha='center', va='bottom')
plt.title('词频统计')
plt.xlabel('关键词')
plt.ylabel('频率')
plt.show()
#绘制饼状图
plt.pie(sizes, explode=explode, labels=key, colors=colors, autopct='%1.1f%%',
shadow=True, startangle=140)
plt.title('词频饼状图')
plt.axis('equal') #确保绘制的是圆形.
plt.show()
上述就是所有内容,文章比较简单,统计词频的方式有很多,本文只是提供了一种思路,如有更好的方式和建议,欢迎在评论区留言!