玩转词云图,推荐一个Pyecharts和Plotly数据分析实战项目
作者:来源于读者投稿
出品:Python数据之道
数据的多种处理操作
基于
pyecharts
和plotly
的饼图和柱状图制作基于
Wordcloud
和pyecharts
的词云图制作利用
jieba
分词,和去停用词后的词云图改进
本文数据文件等素材获取方式见文末。
— 01 —
导入库
pyecharts
相关的,库包含:数据处理相关
pyecharts相关
词云图相关
plotly相关
# 数据处理相关
import pandas as pd
import numpy as np
from datetime import datetime
# 在顶部声明 CurrentConfig.ONLINE_HOST
from pyecharts.globals import CurrentConfig, OnlineHostType, NotebookType
# CurrentConfig.NOTEBOOK_TYPE = NotebookType.JUPYTER_LAB
# OnlineHostType.NOTEBOOK_HOST 默认值为 http://localhost:8888
from pyecharts.charts import Page, Bar, Line, Pie
from pyecharts import options as opts
# 分词
import jieba
# plotly相关
import plotly.express as px
import plotly.graph_objects as go
# 词云图相关
from wordcloud import WordCloud
import matplotlib.pyplot as plt
# pyecharts相关
from pyecharts.globals import ChartType,SymbolType,CurrentConfig,NotebookType
CurrentConfig.ONLINE_HOST = OnlineHostType.NOTEBOOK_HOST
from pyecharts.charts import Sankey,Page,Line,Bar,WordCloud
from pyecharts.globals import ThemeType
from pyecharts.commons.utils import JsCode
from pyecharts import options as opts
— 02 —
测试Pyecharts
jupyter notebook
可能出不来图,最好是先进行测试,保证在线出图from pyecharts.charts import Bar
from pyecharts import options as opts
bar = (
Bar()
.add_xaxis(["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"])
.add_yaxis("商家A", [5, 20, 36, 10, 75, 90])
.set_global_opts(title_opts=opts.TitleOpts(title="主标题", subtitle="副标题"))
# 或者直接使用字典参数
# .set_global_opts(title_opts={"text": "主标题", "subtext": "副标题"})
)
bar.render_notebook()
— 03 —
数据基本信息
数据信息
用户id: cus_id
评论时间: comment_time
评价: sml-str40,表示4颗星✨
评价内容: cus_comment
口味、环境、服务: taste、environment、service
店铺id:shopID
星星数量:stars
年、月、星期、时间:year/month/weekly/hour
评论长度: comment_len
导入数据
查看数据类型
meishi.dtypes
时间数据转换
# 将评论时间comment_time的字符串类型 object 类型转成时间类型
import datetime
meishi["comment_time"] = pd.to_datetime(meishi["comment_time"])
meishi.head(3)
# 如何将时间类型的数据变成字符串形式,使用 strftime() 方法指定时间格式
meishi['comment_time'] = meishi['comment_time'].apply(lambda x: x.strftime('%Y-%m-%d %H:%M:%S'))
meishi.head()
是否有缺失值
meishi.isnull().sum()
— 04 —
数据处理
基于用户cus_id
sophie嘉最多评价了8次
总共有27467个用户进行了评价
df_custom = meishi['cus_id'].value_counts().reset_index().rename(columns={'index':'name', 'cus_id':'number'})[:20] # 前20个用户
df_custom
# 绘图:基于Plotly
# 颜色的随机生成:#123456 # 加上6位数字构成
def random_color_generator(number_of_colors):
color = ["#"+''.join([random.choice('0123456789ABCDEF') for j in range(6)])
for i in range(number_of_colors)]
return color
text = df_custom.number
trace = go.Bar(
x = df_custom.name,
y = df_custom.number,
text = text,
marker = dict(
color = random_color_generator(100),
line = dict(color='rgb(8, 48, 107)',
width = 1.5)
),
opacity = 0.7 # 透明度设置
)
data_custom = [trace]
# 布局设置
layout = go.Layout(
title = '每个用户的评价数量', # 整个图的标题
margin = dict(
l = 100
),
xaxis = dict(
title = '用户名称'
),
yaxis = dict(
title = '评价数量'
),
width = 900,
height = 500
)
fig = go.Figure(data=data_custom, layout=layout)
fig.update_traces(textposition="outside")
fig.show()
基于时间comment_time
px.scatter(meishi, x='cus_id', y='comment_time',color='year')
基于星星(stars或comment_star)
对应关系
sml-str50:5.0
sml-str40:4.0
sml-str30:3.0
sml-str20:2.0
sml-str10:1.0
NAN:0.0
在这里我们直接分析stars字段即可
数据处理
绘图
plotly express
绘制每个星星数量的占比饼图px.pie(meishi_star, names='stars', values='number',color='number')
口味-环境-服务
非常好、很好、好、一般、差、无
。我们对6种评价进行饼图和柱状图的绘制饼图基于
plotly express
柱状图基于
pyecharts
数据处理
# 口味
taste = meishi['taste'].value_counts().reset_index().rename(columns={'index':'taste','taste':'number'})
taste
绘图饼图
# 口味-taste
fig = px.pie(taste, names='taste', values='number',title = '口味评论占比情况')
fig.update_traces(textposition='inside',textinfo='percent+label')
fig.show()
绘制柱状图
# 三个评价在一个坐标系中
c = (
Bar()
.add_xaxis(taste['taste'].tolist())
.add_yaxis('口味', taste['number'].tolist())
.add_yaxis('环境', environment['number'].tolist())
.add_yaxis('服务', service['number'].tolist())
.set_series_opts(label_opts=opts.LabelOpts(is_show=True))
.set_global_opts(title_opts=opts.TitleOpts(title="3种指标评价情况"))
# .render("3种评价.html")
)
c.render_notebook()
# 使用堆叠柱状图
c = (
Bar()
.add_xaxis(taste['taste'].tolist())
.add_yaxis('口味', taste['number'].tolist(), stack='stack1') # 堆叠柱状图
.add_yaxis('环境', environment['number'].tolist(), stack='stack1')
.add_yaxis('服务', service['number'].tolist(), stack='stack1')
.set_series_opts(label_opts=opts.LabelOpts(is_show=True))
.set_global_opts(title_opts=opts.TitleOpts(title="3种指标评价情况"))
# .render("3种评价.html")
)
c.render_notebook()
基于评论内容cus_comment
jieba分词
将全部评价内容放在一起
jieba分词
基于WordCloud实现
首先使用的wordcloud中自带的图形形状
from wordcloud import WordCloud
import matplotlib.pyplot as plt
text = " ".join(i for i in jieba_name)
# 注意:改成自己的字体路径!!!!!
font = r'/Users/Desktop/spider/SimHei.ttf' # 改成相应的字体的路径即可
wc = WordCloud(collocations=False, font_path=font, max_words=2000,
width=4000, height=4000, margin=4).generate(text.lower())
plt.imshow(wc)
plt.axis("off")
plt.show()
wc.to_file('meishi.png') # 把词云保存下来
使用自定义的图形形状
#!/usr/bin/env python
from os import path
from PIL import Image
import numpy as np
import matplotlib.pyplot as plt
from wordcloud import WordCloud, STOPWORDS, ImageColorGenerator
d = path.dirname('.') # 在ide中使用这段代码
# d = path.dirname(__file__)
# 待处理的文件
text = " ".join(i for i in jieba_name)
alice_coloring = np.array(Image.open(path.join(d, "haizewang.png")))
# 设置停用词
stopwords = set(STOPWORDS)
stopwords.add("said")
# 注意:改成相应的字体的路径!!!!
font = r'/Users/peter/Desktop/spider/SimHei.ttf'
wc = WordCloud(background_color="white", font_path=font,
max_words=3000, mask=alice_coloring,
height=8000,width=8000,
stopwords=stopwords, max_font_size=40, random_state=42)
wc.generate(text)
image_colors = ImageColorGenerator(alice_coloring)
# 图片形状的词云
# 我们还可以直接在构造函数中直接给颜色
# 通过这种方式词云将会按照给定的图片颜色布局生成字体颜色策略
plt.imshow(wc.recolor(color_func=image_colors), interpolation="bilinear")
plt.axis("off")
plt.show()
wc.to_file('meishi1.png') # 把词云保存下来
基于pyecharts
所以、真的、不过
等,停用词表是自己在收集汇总的统计单词个数
# 统计每个词的个数
dic = {}
count = 0
for i in jieba_name:
count += 1
dic[i] = count
去停用词
# 去停用词
stopwords = [line.strip() for line in open("nlp_stopwords.txt",encoding='UTF-8').readlines()]
stopwords[:10]
停用词反选
反选符号~
,留下有用的信息排序
df = df.sort_values("number", ascending=False)
df
生成绘图数据
zip
函数生成绘图的数据df_zip = list(zip(df['name'], df['number']))
df_zip[:5]
# 结果
[('好喝', 3380832),
(' ', 3380831),
('味道', 3380795),
('兒時', 3380791),
('好吃', 3380778)]
去停用词绘图
pyecharts
绘图# 绘图
c = (
WordCloud()
.add("", data_pair=df_zip[:20],word_size_range=[12,100], shape=SymbolType.DIAMOND)
.set_global_opts(title_opts=opts.TitleOpts(title='评论内容词云图'))
# .render("meishi.html")
)
c.render_notebook()
— 05 —
总结
基于时间的散点图
不同的柱状图📊
饼图
不同方式的词云图
关于 Plotly 的内容,「Python数据之道」介绍过多次,可以通过下面的专辑内容来了解:
本文来自公众号读者投稿,欢迎各位童鞋向公号投稿,点击下面图片了解详情!
个人格言:不浮于世,不负于己
个人站点:www.renpeter.cn,欢迎常来小屋逛逛