人生苦短

记录大学,记录生活,天道殷勤,请多关注!

人生苦短,我用Python!
大数据、机器学习、深度学习
  menu

记录一次pyecharts新版本的可视化

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/892https://github.com/pyecharts/pyecharts/issues/1033

值得注意的是:

如何安装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

更多文章在我的CSDN博客里面。其实主要原因是那里人多、活跃、交流讨论方便。我的CSDN
这里也会更新,因为solo博客系统实在是太好看了!,不过有点慢喔。


标题:记录一次pyecharts新版本的可视化
作者:chenruhai
地址:http://www.love520.ltd/articles/2020/01/03/1578046875938.html
CSDN博客地址:https://blog.csdn.net/qq_42658739
GitHub地址:https://github.com/chenruhai

评论