pyecharts 是一个用于生成 Echarts 图表的类库。Echarts 是百度开源的一个数据可视化 JS 库。用 Echarts 生成的图可视化效果非常棒,为了与 Python 进行对接,方便在 Python 中直接使用数据生成图,有三个大佬写了这个项目。以下是他们的GitHub地址:
pyecharts的官网: http://pyecharts.herokuapp.com/
pyecharts的版本有1.××和0.5×之分。而且,这两个版本差别还挺大!
v0.5.x 和 V1 间不兼容,V1 是一个全新的版本,详见https://github.com/pyecharts/pyecharts/issues/892 和 https://github.com/pyecharts/pyecharts/issues/1033
值得注意的是:
- v0.5.x 和 V1 间不兼容
- 0.5.x 版本将不再进行维护,0.5.x 版本代码位于 05x 分支,文档位于http://05x-docs.pyecharts.org/
- 新版本系列将从 v1.0.0 开始,文档位于 https://pyecharts.org/。
如何安装pyecharts?
如下安装:
# 安装 v1 以上版本
pip install pyecharts -U
# 如果需要安装 0.5.11 版本的开发者,可以使用
pip install pyecharts==0.5.11
这次可视化任务,我是帮一个群里认识的朋友做的。
其目的是进行一个词云可视化、以及词频分析;数据是关于B站的弹幕评论,然后再做一些对于情感分类的分析、评估。
首先,导库:
import pandas as pd
import numpy as np
import jieba
import collections
from pyecharts import options as opts
from pyecharts.charts import Bar
from pyecharts.charts import Page, WordCloud,Grid
from pyecharts.globals import SymbolType
import warnings
warnings.filterwarnings("ignore", category=Warning)
读取数据:
data = pd.read_csv("data.csv",skiprows=1,names=['times','colors','id','content','program_period'])
print(data.head())
并选择期档和评论数据,由于其它字段没用到,所以没有必要用。
data = data[['content','program_period']]
运用正则表达式,将评论中的数字和英文以及一些特殊字符去除:
data.content = data.content.str.replace('[0-9a-zA-Z]','')
data.content = data.content.str.replace(u'\t|\n|\.|-|:|;|\)|\(|\?|"','')
读入停止词,构造切词的自定义函数,并在切词过程中删除停止词 :
with open(r'stopword.txt', encoding='UTF-8') as words:
stop_words = [i.strip() for i in words.readlines()]
def cut_word(sentence):
#切词过程中删除停止词
words = [i for i in jieba.lcut(sentence) if i not in stop_words]
result = ' '.join(words)# 切完的词用空格隔开,当然,其它符号也行
return(result)
对评论内容进行批量切词:
words = data.content.apply(cut_word)
取出切好的词:
def getworl(words):
object_list = []
for wordstr in words:
wordL = wordstr.split(" ")
for word in wordL:
if (len(word) >= 2):
object_list.append(word)
return object_list
object_list = getworl(words)
object_list
进行词频统计:
#词频统计
word_counts = collections.Counter(object_list)
word_counts_dict = dict(word_counts) #先转成字典说不定有用
print(type(word_counts)) #返回<class 'collections.Counter'>
print(type(word_counts_dict)) #返回<class 'dict'>
#取频数最高的前50个词,并转换为字典格式
word_counts__dict_top100 = dict(word_counts.most_common(50))
#如果不转换为字典的话,word_counts.most_common(50)返回的将是如下格式(列表)的数据:
[('感觉', 4147),
('喜欢', 3566),
('真的', 3157),
('声音', 3153),
('厉害', 3104),
('新闻', 2501),
('主持人', 2440),
('节目', 2145),
('老师', 2084),
('弹幕', 1746)....]
进行一个条形图可视化:
def getBar(word_counts__dict):
bar = Bar()
bar.add_xaxis(list(word_counts__dict.keys())[:])
bar.add_yaxis("词语", list(word_counts__dict.values())[:])
bar.set_global_opts(
title_opts=opts.TitleOpts(title="词频统计图"),
datazoom_opts=opts.DataZoomOpts(),)
return bar
word_counts__dict_top100 = dict(word_counts.most_common(50))
bar = getBar(word_counts__dict_top100)
bar.render_notebook()
# bar.render(path="all_bar.html") #这个是将图表保存为本地HTML文件。
进行一个词云图可视化:
def getWC(word_counts_top):
wc = WordCloud()
wc.add("",word_counts_top , word_size_range=[5, 100]) #取前面1000个
wc.set_global_opts(title_opts=opts.TitleOpts(title="词云"))
return wc
wc = getWC(word_counts.most_common(1000))
wc.render_notebook()
# wc.render(path="all_wc.html")
之后,我又取出每一期的数据进行一个可视化比较:
# 取出每一期的数据 [一、二、三、四]
programList = ['第一期','第二期','第三期','第四期']
def getprogram(dataframe,programList):
programS = []
for program in programList:
data = dataframe[(dataframe['program_period']==program)]
programS.append(data)
return programS
def word_count4(programS,top,topdict):
program1 = []
program2 = []
program3 = []
program4 = []
for program in programS:
program = program.reset_index(drop=True)
words = program.content.apply(cut_word)
object_list = getworl(words)
word_counts = collections.Counter(object_list)
word_counts_top1000 = word_counts.most_common(top)
word_counts_dict_ = dict(word_counts.most_common(topdict))
if program['program_period'][0] == '第一期':
program1.append(word_counts_top1000)
program1.append(word_counts_dict_)
if program['program_period'][0] == '第二期':
program2.append(word_counts_top1000)
program2.append(word_counts_dict_)
if program['program_period'][0] == '第三期':
program3.append(word_counts_top1000)
program3.append(word_counts_dict_)
if program['program_period'][0] == '第四期':
program4.append(word_counts_top1000)
program4.append(word_counts_dict_)
return program1,program2,program3,program4
def getWCP(word_counts_top,Title):
wc = WordCloud()
wc.add("",word_counts_top , word_size_range=[5, 100]) #取前面1000个
wc.set_global_opts(title_opts=opts.TitleOpts(title=Title))
return wc
def getBarP(word_counts__dict,Title):
bar = Bar()
bar.add_xaxis(list(word_counts__dict.keys())[:])
bar.add_yaxis("词语", list(word_counts__dict.values())[:])
bar.set_global_opts(
title_opts=opts.TitleOpts(title=Title),
datazoom_opts=opts.DataZoomOpts(),)
return bar
programS = getprogram(data,programList)
program1,program2,program3,program4 = word_count4(programS,1000,100)
对第一期进行条形图可视化: 【其它期类推】
bar = getBarP(program1[1],"第一期")
bar.render(path="p1_bar.html")
bar.render_notebook()
对第一期词云进行可视化: 【其它期类推】
wc = getWCP(program1[0],"第一期")
wc.render(path="p1_wc.html")
wc.render_notebook()
当然,还有一些是关于图形的分析、以及写了另一个文件是对于数据的分析。这篇博客的主题是可视化,所以就不去讨论那些分析了。
最后,附上两个好东西:
该pyecharts的使用手册: https://pyecharts.org/#/zh-cn/intro
该pyecharts的GitHub地址:https://github.com/pyecharts/pyecharts