600字范文,内容丰富有趣,生活中的好帮手!
600字范文 > 数据可视化大屏(柱状图 条形图 情感分析饼图 地域图 词云图 数据表格图 涟漪散点图)

数据可视化大屏(柱状图 条形图 情感分析饼图 地域图 词云图 数据表格图 涟漪散点图)

时间:2022-10-08 12:24:15

相关推荐

数据可视化大屏(柱状图 条形图 情感分析饼图 地域图 词云图 数据表格图 涟漪散点图)

基于pyecharts.charts绘制图形

最终效果展示:

准备工作

import pandas as pdfrom pyecharts.charts import Map, Pie, Bar, WordCloud, Page, EffectScatter # 制作图形from ponents import Table # 制作表格from pyecharts import options as optsfrom pyecharts.globals import ThemeType # 全局设置主题颜色import numpy as npfrom snownlp import SnowNLP# 情感分析theme_config = ThemeType.CHALK # 颜色方案# 表格和标题的颜色(设置多种主题)绘制图形的底色table_color = ""if theme_config == ThemeType.DARK:table_color = '#333333'elif theme_config == ThemeType.CHALK:table_color = '#293441'elif theme_config == ThemeType.PURPLE_PASSION:table_color = '#5B5C6E'elif theme_config == ThemeType.ROMANTIC:table_color = '#F0E8CD'elif theme_config == ThemeType.ESSOS:table_color = '#FDFCF5'else:table_color = ''# 读取文件(根据自己的数据文件来)df_file = pd.read_csv("../data/微博评论_女篮世界杯.csv", parse_dates=["评论时间"])

看一眼我的爬虫数据:(我用的是csv读取,也可以先存入到数据库中在进行读取)

1、柱状图

def bar():#parse_dates=['评论时间']只有在后面加评论时间时,才能将时间格式化df = df_filedata = df[['评论点赞数']]# 设置分段bins = [0, 2, 5, 10, 50, 500, 100000]# 设置标签labels = ['0-2', '2-5', '5-10', '10-50', '50-500', '500-10w']# 按分段离散化数据segments = pd.cut(data['评论点赞数'], bins, labels=labels) # 按分段切割数据counts = pd.value_counts(segments, sort=False).values.tolist() # 统计个数c = (Bar(init_opts=opts.InitOpts(theme=theme_config, width="450px",height="350px", chart_id=1)) # 初始化条形图.add_xaxis(labels, ) # 增加x轴数据.add_yaxis("点赞量", counts) # 增加y轴数据.set_global_opts(legend_opts=opts.LegendOpts(pos_left='right'),title_opts=opts.TitleOpts(title="点赞量区间分布-柱形图", pos_left='center'), # 标题toolbox_opts=opts.ToolboxOpts(is_show=False, ), # 不显示工具箱xaxis_opts=opts.AxisOpts(name="点赞量", # x轴名称axislabel_opts=opts.LabelOpts(font_size=8)), # 字体大小yaxis_opts=opts.AxisOpts(name="评论数",axislabel_opts={"rotate": 0},splitline_opts=opts.SplitLineOpts(is_show=True,linestyle_opts=opts.LineStyleOpts(type_='solid')),), # y轴名称)# 标记最大值.set_series_opts(markpoint_opts=opts.MarkPointOpts(data=[opts.MarkPointItem(type_="max",name="最大值"), ],symbol_size=35) # 标记符号大小))c.render("1.html")print('生成完毕:评论数分布-柱形图.html')return c

效果展示:

2、饼状图

def pie():df = pd.read_csv("../data/微博评论_乔欣.csv")# df = df_filedf['评论者IP归属地'] = df['评论者IP归属地'].astype(str).str.replace('来自', '') # 数据清洗df['评论者IP归属地'] = df['评论者IP归属地'].astype(str).str.replace('中国', '') # 数据清洗loc_grp = df.groupby('评论者IP归属地').count()['评论内容']# data_list = list(zip(loc_grp.index.tolist(), loc_grp.values.tolist()))# print(data_list)address_index = loc_grp.index.tolist()address_values = loc_grp.values.tolist()c = (Pie(init_opts=opts.InitOpts(chart_id=2, bg_color=table_color,theme=ThemeType.INFOGRAPHIC)).add("", [list(z) for z in zip(address_index,address_values)]).set_global_opts(title_opts=opts.TitleOpts(title="评论地域分布图",title_textstyle_opts=opts.TextStyleOpts(font_size=25,color='#C0C0B8')),legend_opts=opts.LegendOpts(orient="vertical",pos_left="5%",pos_top="10%")).set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}")))c.render("2.html")print('生成完毕:评论地域分布-饼状图.html')return c

效果图:

3、情感分析饼图

def pie2():df = pd.read_csv("../data/微博评论_乔欣.csv")# df = df_filedata = df["评论内容"]pos_count = 0 # 计数器-积极mid_count = 0 # 计数器-中性neg_count = 0 # 计数器-消极for comment in data:comment = str(comment)# 数据格式化为字符串sentiments_score = SnowNLP(comment).sentiments # 情感评分,值越接近1越积极# print(sentiments_score)if sentiments_score < 0.4: # 情感分小于0.4判定为 消极neg_count += 1elif 0.4 <= sentiments_score <= 0.6: # 情感分在[0.4,0.6]直接判定为 中性mid_count += 1else: # 情感分大于0.6判定为 积极pos_count += 1# 画饼图pie = (Pie(init_opts=opts.InitOpts(theme=theme_config, width="450px", height="350px", chart_id=3)).add(series_name="评论区情感分布", # 系列名称data_pair=[['积极', pos_count], # 添加数据['中性', mid_count],['消极', neg_count]],rosetype="radius", # 是否展示成南丁格尔图radius=["30%", "55%"], # 扇区圆心角展现数据的百分比,半径展现数据的大小) # 加入数据.set_global_opts( # 全局设置项title_opts=opts.TitleOpts(title="评论区情感分布-饼图", pos_left='center'), # 标题legend_opts=opts.LegendOpts(pos_left='right', orient='vertical') # 图例设置项,靠右,竖向排列).set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}"))) # 样式设置项pie.render('3.html') # 生成html文件print('生成完毕:评论区情感分布_饼图.html')return pie

效果图:

4、词云图

def ciyun():df = df_filedata = df[['评论内容']]data_list = list(zip(data.index.tolist(), data.values.tolist()))wc = (WordCloud(init_opts=opts.InitOpts(width="450px", height="350px",theme=theme_config, chart_id=4)).add(series_name="评论内容分析",data_pair=data_list,word_size_range=[15, 20],width='400px', # 宽度height='300px', # 高度word_gap=5 # 单词间隔) # 增加数据.set_global_opts(title_opts=opts.TitleOpts(pos_left='center',title="微博评论内容-词云图",title_textstyle_opts=opts.TextStyleOpts(font_size=20) # 设置标题),tooltip_opts=opts.TooltipOpts(is_show=True), # 不显示工具箱).set_series_opts(label_opts=opts.LabelOpts(is_show=True)))wc.render('4.html') # 生成html文件print('生成完毕:评论内容_词云图.html')return wc

效果图:

5、地域图

def map():df = pd.read_csv("../data/微博评论_乔欣.csv")# df = df_filedf['评论者IP归属地'] = df['评论者IP归属地'].astype(str).str.replace('来自', '') # 数据清洗df['评论者IP归属地'] = df['评论者IP归属地'].astype(str).str.replace('中国', '') # 数据清洗loc_grp = df.groupby('评论者IP归属地').count()['评论内容']# data_list = list(zip(loc_grp.index.tolist(), loc_grp.values.tolist()))# print(data_list)address_index = loc_grp.index.tolist()address_values = loc_grp.values.tolist()c = (Map(init_opts=opts.InitOpts(chart_id=5,bg_color=table_color)).add("评论者地域分布", [list(z) for z in zip(address_index,address_values)], "china").set_global_opts(title_opts=opts.TitleOpts(title="评论者在全国的分布图",title_textstyle_opts=opts.TextStyleOpts(font_size=25,color='#FFFFFF')),visualmap_opts=opts.VisualMapOpts(max_=250),))c.render("5.html")print('生成完毕:评论者分布-地域图.html')return c

效果图:

6、数据表格图

def table():df = df_filedf["评论时间"] = df["评论时间"].dt.date # 把发布时间转换为发布日期# df[['评论者id'], ['评论者姓名'], ['评论点赞数'], ['评论者IP归属地'], ['评论内容']]pd.set_option('display.max_columns', 10)data = df.nlargest(n=10, columns='评论点赞数')data = np.array(data) # 点赞量前十的评论weibo_list = []for item in data:weibo = []weibo.append(str(item[7]))weibo.append(str(item[6]))weibo.append(str(item[4]))weibo.append(str(item[3]))weibo.append(str(item[5]))weibo.append(str(item[-1]))weibo_list.append(weibo)# print(weibo_list)table = (Table(page_title='我的表格标题', ).add(headers=['评论者id', '评论者姓名', '评论点赞数', '评论时间', '评论者IP归属地', '评论内容'], rows=weibo_list, attributes={"align": "left","border": False,"padding": "20px","style": "background:#2B3541; font-size:10px; color:#C0C0C0;padding:3px;"}).set_global_opts(title_opts=opts.TitleOpts(title='这是表格1')))table.render('6.html')print('生成完毕:热评TOP10_数据表格.html')return table

效果图:

7、涟漪散点图

def scatter():df = pd.read_csv("../data/微博评论_乔欣.csv", parse_dates=["评论时间"])# df = df_filedf["评论时间"] = df["评论时间"].dt.date # 把发布时间转换为发布日期df['评论时间'] = df['评论时间'].astype(str).str.replace('-', '') # 数据清洗 不要年份x_data = []y_data = []df1 = df["评论时间"].drop_duplicates() # 去除重复的行df1 = df1.sort_values()# 排序# 需要将df1中的数据以列表的形式存放到x_data中for i in df1:x_data.append(i)df2 = df.groupby("评论时间").count()['评论点赞数'] # 得到同一时间段下,点赞数之和,没有时间的数据for i in df2:y_data.append(i)# print(x_data)# print(y_data)sc = (EffectScatter(init_opts=opts.InitOpts(width="450px", height="350px", theme=theme_config, chart_id=7)).add_xaxis(xaxis_data=x_data).add_yaxis(series_name="时间分布",y_axis=y_data,symbol_size=10,label_opts=opts.LabelOpts(is_show=False)).set_series_opts().set_global_opts(title_opts=opts.TitleOpts(title="评论点赞数时间分布"),xaxis_opts=opts.AxisOpts(splitline_opts=opts.SplitLineOpts(is_show=True)), # 设置X轴分割线yaxis_opts=opts.AxisOpts(splitline_opts=opts.SplitLineOpts(is_show=True)), # 设置Y轴分割线))sc.render('7.html')print('生成完毕:评论点赞数时间分布-涟漪散点图.html')return sc

效果图:

8、条形图

def bar2():df = df_filepd.set_option('display.max_columns', 10)data = df.nlargest(n=10, columns='评论点赞数')# data = np.array(data) # 点赞量前十的评论(转换为列表数组格式)y_data = list(data["评论点赞数"])# 转换成ndarray然后转换成int数据类型,然后转换成listy_data = np.array(y_data).astype(dtype=int).tolist()x_data = list(data["评论者姓名"])# 画条形图bar = (Bar(init_opts=opts.InitOpts(theme=theme_config, chart_id=8)) # 初始化条形图.add_xaxis(x_data) # 增加x轴数据.add_yaxis("评论者姓名及点赞量", y_data) # 增加y轴数据.reversal_axis() # 设置水平方向.set_series_opts(label_opts=opts.LabelOpts(position="right")) # Label出现位置.set_global_opts(legend_opts=opts.LegendOpts(pos_left='right'),title_opts=opts.TitleOpts(title="评论点赞量TOP10_条形图", pos_left='center'), # 标题toolbox_opts=opts.ToolboxOpts(is_show=False, ), # 不显示工具箱xaxis_opts=opts.AxisOpts(name="点赞量", # x轴名称axislabel_opts=opts.LabelOpts(font_size=8, rotate=0),splitline_opts=opts.SplitLineOpts(is_show=False)),yaxis_opts=opts.AxisOpts(name="微博名", # y轴名称axislabel_opts=opts.LabelOpts(font_size=7, rotate=45), # y轴名称)))bar.render("8.html") # 生成html文件print('生成完毕:评论点赞量TOP10-条形图.html')return bar

这里需要强调的是x_data和y_data,x、y轴数据一定不要弄反了,不然就像我一样发现没有效果,找问题找了半天,哎。。。

效果图:

9、制作大屏的标题

def title():table = Table()table.add(headers=["基于Pyecharts的微博评论数据大屏"], rows=[], attributes={"align": "center","padding": "2px","style": "background:#2B3541; width:1350px; height:50px; font-size:25px; color:#C0C0C0;"})table.render('大标题.html')print('生成完毕:大标题.html')return table

效果图:

10、最后就是主函数以及最终大屏的生成

def main():# 制作大屏# 绘制:整个页面page = Page(page_title="基于Pyecharts的微博评论数据大屏",layout=Page.DraggablePageLayout, # 拖拽方式)page.add(# 增加:大标题title(),# 1、柱状图bar(),# 2、制作饼状图pie(),# 3、情感分析饼图pie2(),# 4、词云图ciyun(),# 5、地域图map(),# 6、数据表格图table(),# 7、涟漪散点图scatter(),# 8、条形图bar2())page.render('可视化大屏_临时.html')# 执行完毕后,打开临时html并排版,排版完点击Save Config,把json文件放到本目录下print('生成完毕:可视化大屏_临时.html')if __name__ == '__main__':main()

然后再运行以下代码,生成最终的可视化大屏:

from pyecharts.charts import PagePage.save_resize_html(source="可视化大屏_临时.html",cfg_file="chart_config.json",dest="可视化大屏.html")

最后想说的是,发这篇文章主要目的是记录一下自己写毕业设计的过程。里面的爬虫数据可能比较单一,所以最终绘制的图形不那么好看,你可以在我的基础上进行加工,希望这些对你有所帮助。

这是我第一次写文章,感觉不错的话,请给我点个赞,谢谢!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。