问题描述
需要将excel中的一列内容转换成柱状图和词云,所以用到了matplotlib/xlrd/wordcloud三个库来解决问题
xlrd:读取excel文件
matplotlib:画柱状图
wordcloud:生成词云
具体步骤
xlrd读取文件:
import xlrd
def start_generate():
path = "test.xlsx"
data = xlrd.open_workbook(path)
sheet1 = data.sheet_by_name('Sheet1') # Sheet1 左下角的sheet
list1 = sheet1.col_values(0) # 第一列的数据列表
matplotlib:画柱状图
import matplotlib.pyplot as plt
def draw_from_dict(dicdata, RANGE):
#dicdata:字典的数据。
#RANGE:截取显示的字典的长度。
by_value = sorted(dicdata.items(),key = lambda item:item[1],reverse=True) # 对字典进行排序
x = []
y = []
for d in by_value:
x.append(d[0])
y.append(d[1])
plt.barh(x[0:RANGE], y[0:RANGE]) # 横向柱状图
plt.tight_layout() # 左侧显示不全,使用该函数
plt.savefig('plt.png') # 保存
plt.show()
wordcloud:词云
from wordcloud import WordCloud
def draw_from_list(lis): # 传入的list
text = ' '.join(lis)
wordcloud = WordCloud(background_color='white',
max_words=300,
font_path="Kai.ttf", # 当前目录下中文楷体 结尾有下载
width=1600,
height=1000).generate(text)
wordcloud.to_file("WordCloud.png")
完整代码(完成的是对第一列数据的操作,需要其他列数据自行修改)
import xlrd
import matplotlib.pyplot as plt
from wordcloud import WordCloud
def draw_from_list(lis):
text = ' '.join(lis)
wordcloud = WordCloud(background_color='white',
max_words=300,
font_path="Kai.ttf",
width=1600,
height=1000).generate(text)
wordcloud.to_file("WordCloud.png")
def draw_from_dict(dicdata, RANGE):
#dicdata:字典的数据。
#RANGE:截取显示的字典的长度。
by_value = sorted(dicdata.items(),key = lambda item:item[1],reverse=True)
x = []
y = []
for d in by_value:
x.append(d[0])
y.append(d[1])
plt.barh(x[0:RANGE], y[0:RANGE])
plt.tight_layout()
plt.savefig('test.png')
plt.show()
def start_generate():
path = "test.xlsx"
data = xlrd.open_workbook(path)
sheet1 = data.sheet_by_name('Sheet1')
list1 = sheet1.col_values(0)
dic = dict()
for i in list1:
val = dic.get(i)
if val:
dic[i] = val+1
else:
dic[i] = 1
draw_from_list(list1)
draw_from_dict(dic, len(dic))
if __name__ == '__main__':
start_generate()
遇到的问题
开始生成柱状图的时候,ylable全是乱码,通过这个链接解决了(注意去掉对应配置的'#',最后一步rebuild很重要!)
下载链接