【Python可视化大屏】「淄博烧烤」热评舆情分析大屏

news2025/1/22 16:55:58

文章目录

  • 一、开发背景
  • 二、爬虫代码
    • 2.1 展示爬取结果
    • 2.3 导入MySQL数据库
  • 三、可视化代码
    • 3.1 大标题
    • 3.2 词云图(含:加载停用词)
    • 3.3 玫瑰图(含:snownlp情感分析)
    • 3.4 柱形图-TOP10关键词
    • 3.5 折线图-讨论热度趋势
    • 3.6 地图-IP分布
    • 3.7 Page组合大屏
  • 四、彩蛋-多种颜色主题
    • 4.1 INFOGRAPHIC主题
    • 4.2 MACARONS主题
    • 4.3 SHINE主题
    • 4.4 WALDEN主题
    • 4.5 WESTEROS主题
    • 4.6 WHITE主题
    • 4.7 WONDERLAND主题
  • 五、技术总结
  • 六、在线体验
  • 七、演示视频

一、开发背景

您好,我是@马哥python说 ,一枚10年程序猿。

自从2023.3月以来,"淄博烧烤"现象持续占领热搜流量,体现了后疫情时代众多网友对人间烟火气的美好向往,本现象级事件存在一定的数据分析实践意义。

动态效果演示:

【大屏演示】Python可视化舆情大屏「淄博烧烤」

二、爬虫代码

2.1 展示爬取结果

爬虫代码部分不做讲解。

展示爬取结果:
部分爬取数据

2.3 导入MySQL数据库

最核心的三行代码:

# 读取csv数据
df = pd.read_csv('去重后_' + comment_file)
# 把csv数据导入MySQL数据库
df.to_sql(name='t_zbsk', con=engine, chunksize=1000, if_exists='replace', index=False)
print('导入数据库完成!')

用create_engine创建数据库连接,格式为:

create_engine(‘数据库类型+数据库驱动://用户名:密码@数据库IP地址/数据库名称’)

这样,数据库连接就创建好了。

然后,用pandas的read_csv函数读取csv文件。

最后,用pandas的to_sql函数,把数据存入MySQL数据库:

  • name=‘college_t2’ #mysql数据库中的表名
  • con=engine # 数据库连接
  • index=False #不包含索引字段
  • if_exists=‘replace’ #如果表中存在数据,就替换掉

非常方便地完成了反向导入,即:从csv向数据库的导入。

这个部分的讲解视频:
仅用Python三行代码,实现数据库和excel之间的导入导出

三、可视化代码

3.1 大标题

由于pyecharts组件没有专门用作标题的图表,我决定灵活运用Line组件实现大标题。

首先,找到一张星空图作为大屏背景图:
大屏背景图

然后,在Line组件中加入js代码,加载背景图:

# 设置背景图片
line3.add_js_funcs(
    """
    var img = new Image(); img.src = './static/bg2.png';
    """
)

大标题效果如下:
最上方的大标题

3.2 词云图(含:加载停用词)

绘制词云图,需要先进行中文分词。既然分词,就要先设置停用词,避免干扰词影响分析结果。
这里采用哈工大停用词作为停用词词典。

# 停用词列表
with open('hit_stopwords.txt', 'r') as f:
    stopwords_list = f.readlines()
stopwords_list = [i.strip() for i in stopwords_list]

这样,所有停用词就存入stopwords_list这个列表里了。

如果哈工大停用词仍然无法满足需求,再加入一些自定义停用词,extend到这个列表里:

# 加入自定义停用词
stopwords_list.extend(
    ['3', '5', '不', '都', '好', '人', '吃', '都', '去', '想', '说', '还', '很', '…', 'nan', '真的', '不是',
     '没', '会', '看', '现在', '觉得', ' ', '没有', '上', '感觉', '大', '太', '真', '哈哈哈', '火', '挖', '做',
     '一下', '不能', '知道', '这种', '快'])

现在就可以愉快的绘制词云图了,部分核心代码:

wc = WordCloud(init_opts=opts.InitOpts(width='600px', height=chart_height, theme=theme_config, chart_id='wc1'))
wc.add(series_name="评论内容",
       data_pair=data300,
       word_gap=1,
       word_size_range=[20, 70],
       )  # 增加数据
wc.set_global_opts(
    title_opts=opts.TitleOpts(pos_left='center',
                              pos_top='0%',
                              title=v_title,
                              title_textstyle_opts=opts.TextStyleOpts(font_size=20, color=title_color)  # 设置标题
                              ),
    tooltip_opts=opts.TooltipOpts(is_show=True),  # 显示提示
)

词云图效果:
评论内容-词云图

3.3 玫瑰图(含:snownlp情感分析)

先对评论数据进行情感判定,采用snownlp技术进行情感打分及判定结果:

for comment in cmt_list:
    sentiments_score = SnowNLP(comment).sentiments
    if 0 <= sentiments_score < 0.2:  # 情感分小于0.2,判定为极其消极
        tag = '极其消极'
        neg_very_count += 1
    elif 0.2 <= sentiments_score < 0.4:  # 情感分在0.2和0.4之间,判定为比较消极
        tag = '比较消极'
        neg_count += 1
    elif 0.4 <= sentiments_score < 0.6:  # 情感分在0.4和0.6之间,判定为中性
        tag = '中性'
        mid_count += 1
    elif 0.6 <= sentiments_score < 0.9:  # 情感分在0.6和0.9之间,判定为比较积极
        tag = '比较积极'
        pos_count += 1
    else:  # 情感分大于0.9,判定为极其积极
        tag = '极其积极'
        pos_very_count += 1

将情感分析结果用pandas保存到一个Excel文件里,如下:
情感判定结果
绘制玫瑰图,部分核心代码:

# 画饼图
pie = (
    Pie(init_opts=opts.InitOpts(theme=theme_config, width=chart_width, height=chart_height, chart_id='pie1'))
    .add(series_name="情感分类",  # 系列名称
         data_pair=[  # 添加数据
             ['极其积极', pos_very_count],
             ['比较积极', pos_count],
             ['中性', mid_count],
             ['比较消极', neg_count],
             ['极其消极', neg_very_count],
         ],
         rosetype="radius",  # 是否展示成南丁格尔图
         radius=["20%", "65%"],  # 扇区圆心角展现数据的百分比
         )  # 加入数据
    .set_global_opts(  # 全局设置项
        title_opts=opts.TitleOpts(title=v_title,
                                  pos_left='center',
                                  title_textstyle_opts=opts.TextStyleOpts(color=title_color, ), ),  # 标题
        legend_opts=opts.LegendOpts(pos_left='center', pos_top='8%', orient='horizontal',
                                    textstyle_opts=opts.TextStyleOpts(color='white', ))  # 图例字体颜色
    )
)

玫瑰图效果:
情感分布-玫瑰图

3.4 柱形图-TOP10关键词

先根据词云图部分提取出TOP10高频词(过滤掉停用词之后的):

data10 = collections.Counter(result).most_common(10)

然后带入柱形图,部分核心代码:

 # 画柱形图
bar = Bar(
    init_opts=opts.InitOpts(theme=theme_config, width='780px', height=chart_height,
                            chart_id='bar1'))  # 初始化条形图
bar.add_xaxis(x_data)  # 增加x轴数据
bar.add_yaxis("高频词汇", y_data)  # 增加y轴数据
bar.set_series_opts(label_opts=opts.LabelOpts(position="top"))  # Label出现位置
bar.set_global_opts(。。。)

柱形图效果:
top10高频词-柱形图

3.5 折线图-讨论热度趋势

首先,根据评论时间统计出每天的评论数量:

# 按日期分组统计评论数量
df_comments['评论日期'] = df_comments['评论时间'].astype(str).str[:10]  # 提取日期
grp = df_comments.groupby('评论日期')['评论内容'].count()

然后,根据统计数据画出折线图,部分核心代码:

line = Line(
init_opts=opts.InitOpts(width='780px', height=chart_height, theme=theme_config, chart_id='line1'))  # 实例化
line.add_xaxis(x_data)  # 加入X轴数据
line.add_yaxis('讨论数量', y_data, is_smooth=True,
           areastyle_opts=opts.AreaStyleOpts(color=JsCode(area_color_js), opacity=1), )  # 加入Y轴数据
line.set_global_opts(。。。)

折线图效果:
讨论热度趋势-折线图

3.6 地图-IP分布

由于IP属地字段都包含"来自"两字,先进行数据清洗,将"来自"去掉:

# 数据清洗-ip属地
ip_count = df_comments['评论者IP归属地'].str.replace('来自', '')

然后统计各个IP属地的数量,方便后续带入地图可视化:

# 统计各IP数量
ip_count = ip_count.value_counts()

下面开始绘制地图,部分核心代码:

f_map = (
    Map(init_opts=opts.InitOpts(width='600px',
                                height='600px',
                                theme=theme_config,
                                page_title=v_title,
                                chart_id='map1',
                                bg_color=None))
    .add(series_name="评论数量",
         data_pair=list(zip(loc_list, value_list)),
         maptype="china",  # 地图类型
         is_map_symbol_show=False)
    .set_global_opts(。。。)
    .set_series_opts(label_opts=opts.LabelOpts(is_show=True, font_size=8, ),
                     markpoint_opts=opts.MarkPointOpts(
                         symbol_size=[90, 90], symbol='circle'),
                     effect_opts=opts.EffectOpts(is_show='True', )
                     )
)

地图效果,如下:
评论IP分布-中国地图

当然,地图中的颜色,都是自己设置的十六进制颜色,可以根据自己的喜好更改。

3.7 Page组合大屏

最后,也是最关键的一步,把以上所有图表组合到一起,用Page组件,并且选用DraggablePageLayout方法,即拖拽的方式,组合图表:

# 绘制:整个页面
page = Page(
    page_title='热门评论可视化分析大屏-以"淄博烧烤"为例',
    layout=Page.DraggablePageLayout,
)
page.add(
    # 绘制:大标题
    make_title(v_title='热门评论可视化分析大屏-以"淄博烧烤"为例'),
    # 绘制:词云图
    make_wordcloud(v_title='评论内容-词云图'),
    # 绘制:饼图
    make_analyse_pie(v_title='情感分布-玫瑰图'),
    # 绘制:柱形图
    make_bar(v_title='TOP10关键词-柱形图'),
    # 绘制:折线图
    make_line(v_title='讨论热度趋势-折线图'),
    # 绘制:地图
    make_map(v_title='评论IP分布-中国地图'),
)
page.render('大屏_临时.html') 

本代码执行完毕后,打开临时html并排版,排版完点击Save Config,把json文件放到本目录下。

再执行最后一步,调用json配置文件,生成最终大屏文件。

Page.save_resize_html(
	source="大屏_临时.html",  # 源html文件
	cfg_file="chart_config.json",  # 配置文件
	dest="大屏_最终.html"  # 目标html文件
)

至此,所有代码执行完毕,生成了最终大屏html文件。

四、彩蛋-多种颜色主题

分享一个小技巧,我设置了一键更换颜色主题:

# 整体主题颜色
theme_config = ThemeType.SHINE

只需更换ThemeType参数,即可实现一键更换主题!

4.1 INFOGRAPHIC主题

INFOGRAPHIC

4.2 MACARONS主题

MACARONS

4.3 SHINE主题

SHINE

4.4 WALDEN主题

WALDEN

4.5 WESTEROS主题

WESTEROS

4.6 WHITE主题

WHITE

4.7 WONDERLAND主题

WONDERLAND

更多颜色主题等待小伙伴去发掘!

五、技术总结

技术开发流程:

  1. requests 爬虫发送请求
  2. json 解析返回数据
  3. re 正则表达式清洗文本
  4. pandas保存csv文件
  5. sqlalchemy 保存MySQL数据
  6. pyecharts 可视化开发
  7. snownlp 情感分析
  8. jieba 中文分词
  9. pyecharts+page 组合大屏
  10. flask 启动网页服务

六、在线体验

为了方便大家体验可视化动态交互效果,我把此大屏部署到了服务器,请移步:
马哥python说 - 效果演示

七、演示视频

效果演示视频:

【大屏演示】Python可视化舆情大屏「淄博烧烤」


首发公号:【可视化大屏】“淄博烧烤”热评舆情分析大屏


我是马哥,全网累计粉丝上万,欢迎一起交流python技术。

各平台搜索“马哥python说”:知乎、哔哩哔哩、小红书、新浪微博。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/632947.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ViewOverlay-使用简单实践

ViewOverlay-使用简单实践 一、ViewOverlay能实现什么&#xff1f;二、基础用法2.1 一个简单案例2.2 overlay.add(drawable)/groupOverlay.add(view)之后&#xff0c;不显示问题解决2.2.1 add(Drawable)方法2.2.1 add(View)方法 一、ViewOverlay能实现什么&#xff1f; 在Andro…

北京软件外包开发流程

随着软件的规模越做越多&#xff0c;功能也越来越复杂&#xff0c;对项目管理和开发人员也提出了更高的要求。软件开发的流程通常包括需求分析、项目评估与计划、设计、编码、测试等多个环节&#xff0c;今天和大家分享这方面的知识&#xff0c;希望对大家有所帮助。 软件外包开…

关系代数表达式练习(针对难题)

教师关系T&#xff08;T#,TNAME,TITLE&#xff09;课程关系C(C#,CNAME,TNO)学生关系S(S#,SNAME,AGE,SEX)选课关系SC(S#,C#,SCORE) 检索至少选修了C2,C4两门课程的学生学号&#xff1a; 涉及减法相关&#xff1a; 检索不学C2课的学生姓名和年龄 涉及除法相关&#xff1a; 检索…

使用SQL语句创建存储过程

前言: 本篇文章是记录学校学习SQL server中知识,可用于复习资料. 目录 前言:一、存储过程的创建1、创建简单存储过程2、创建带参数的存储过程3、创建带输出参数的存储过程 二 、使用T一SQL语句管理和维护存储过程2.1 使用sp_helptext查看存储过程student_sc的定义脚本2.2 使用…

Redis安装与启动

概念 简介&#xff1a;Redis是基于内存的数据结构存储系统&#xff0c;它可以用作:数据库、缓存和消息中间件。特点&#xff1a;Redis是用C语言开发的一个开源的高性能健值对(key-value)数据库&#xff0c;官方提供的数据是每秒内查询次数十万加。它存储的value类型比较丰富&a…

问麻了…阿里一面索命27问,过了就60W+

前言 在40岁老架构师尼恩的&#xff08;50&#xff09;读者社区中&#xff0c;经常有小伙伴&#xff0c;需要面试阿里、 百度、头条、美团、京东等大厂。 下面是一个小伙伴成功拿到通过了阿里三次技术面试&#xff0c;小伙伴通过三个多小时技术拷问&#xff0c;最终拿到 offe…

git修改commit的注释内容

文章目录 1. 查看所有commit2. 修改最近一次commit注释3. 修改某一次commit注释 要修改 Git 中的 commit 注释内容&#xff0c;可以使用 git commit --amend 命令。具体步骤如下&#xff1a; 1. 查看所有commit 运行 git log --oneline 命令&#xff0c;查看需要修改的 commi…

202316读书笔记|《作家榜名著:花间集》——花半坼,雨初晴,满身香雾簇朝霞,娇艳轻盈香雪腻

202316读书笔记|《作家榜名著&#xff1a;花间集》——花半坼&#xff0c;雨初晴&#xff0c;满身香雾簇朝霞&#xff0c;娇艳轻盈香雪腻 《作家榜名著&#xff1a;花间集》作者赵崇祚 房开江。这里有绮丽的艳词&#xff0c;缱绻的缠绵&#xff0c;温婉绵延的思愁。或慵懒梳洗迟…

springboot+vue.js学生宿舍报修信息管理系统68ozj

本学生宿舍信息管理系统管理员&#xff0c;学生&#xff0c;维修人员&#xff0c;商家四个角色。管理员功能有个人中心&#xff0c;班级管理&#xff0c;学生管理&#xff0c;维修人员管理&#xff0c;商家管理&#xff0c;宿舍信息管理&#xff0c;宿舍安排管理&#xff0c;报…

【沐风老师】详解3DMAX一键破损插件PolyDamage使用方法

3DMAX一键破损插件教程 3dMax一键破损插件PolyDamage是一种快速添加模型损坏和缺陷的工具。现实生活中没有什么是完美的,所以给你的模型增加一些破损会看起来更逼真。PolyDamage是使用其他软件包手动雕刻损伤的快速替代方案。PolyDamage为混凝土墙、地面、石头和柱子增添了…

什么是Vue的Virtual DOM,如何使用?

什么是Vue的Virtual DOM&#xff0c;如何使用&#xff1f; Vue是一款流行的JavaScript框架。它采用了Virtual DOM的概念来提高应用程序的性能和响应能力。本文将介绍Vue的Virtual DOM是什么&#xff0c;以及如何使用它来构建更快的Vue应用程序。 什么是Vue的Virtual DOM&#…

萤石摄像头RTSP流获取(黑屏解决)

前言 在获取萤石摄像头RTSP视频流时&#xff0c;视频流获取不成功&#xff0c;黑屏并且一直显示缓冲中。下面对获取过程中查阅的资料和解决方案做一下汇总。 打开RTSP 在萤石云视频APP中打开RTSP&#xff0c;【我的】-【工具】-【局域网设备预览】-【开始扫描】-【选择摄像头…

【前端 - CSS】第 12 课 - 字体修饰属性

欢迎来到博主 Apeiron 的博客&#xff0c;祝您旅程愉快 &#xff01; 时止则止&#xff0c;时行则行。动静不失其时&#xff0c;其道光明。 目录 1、缘起 2、字体修饰属性 2.1、字体大小 2.2、字体粗细 2.3、字体倾斜 2.4、字体族 2.5、font 复合属性 2.6、文本缩进 …

基于YOLOv5的火焰烟雾检测算法实战

一个不知名大学生&#xff0c;江湖人称菜狗 original author: Jacky Li Email : 3435673055qq.com Time of completion&#xff1a;2023.6.11 Last edited: 2023.6.11 导读&#xff1a; 火焰烟雾检测是智慧安防业务场景中重要的功能之一&#xff0c;本文提出了一种基于YOLOv5的…

热力管网DTU,让管网运营更加高效可靠

供热行业一直是人们生活中不可或缺的重要组成部分&#xff0c;然而&#xff0c;传统的热力管网维护方式却存在一系列隐患&#xff0c;尤其是在数据传输和安全方面。这些问题可能给您的工作带来许多麻烦和困扰。 首先&#xff0c;数据传输速度缓慢成为制约供热管网维护效率的主要…

chatgpt赋能python:Python的库

Python的库 Python是一种流行的编程语言&#xff0c;被广泛用于Web开发、数据科学、人工智能等领域。Python语言的优点之一就是其强大的库生态系统。库是Python中可重用的模块&#xff0c;可以帮助程序员快速构建现代应用程序。本文将介绍Python中的库及其用法。 什么是Pytho…

chatgpt赋能python:Python如何去除字符串中的空格

Python如何去除字符串中的空格 在Python中&#xff0c;字符串是一种非常重要的数据类型&#xff0c;用于表示文本。但是&#xff0c;在实际编程中&#xff0c;经常需要去除字符串中的空格。本文将介绍Python中几种常用的去除字符串中空格的方法。 1. 使用strip()方法 strip(…

持久化RDB/AOF-Redis(三)

上篇文章说了数据持久化&#xff0c;这里再学习一个命令。 数据结构-Redis&#xff08;二&#xff09;https://blog.csdn.net/ke1ying/article/details/131118016 一、查询所有key scan 0 match zhuge* count 1 他会返回游标&#xff0c;下次查询用返回的游标 直到游标返回…

CH573-00-简介——RISC-V内核BLE MCU快速开发教程

一、本系列内容简介 本系列文章为个人在学习并使用CH573这款RISC-V内核BLE MCU的过程中进行的记录总结&#xff0c;以帮助大家快速开发&#xff08;非深入开发&#xff09;&#xff0c;每节内容对应CSDN的一篇文章&#xff0c;详见主页&#xff0c;完整内容结构如下所示&#x…

ffmpeg开发环境搭建(ubuntu18.04 和mac)

文章目录 1、MAC开发环境1.1、安装brew1.2、 Homebrew使⽤1.3、下载FFmpeg 4.2版本1.4、安装第三方库1.5、 安装SDL21.6、配置编译ffmpeg 2、ubuntu18.04开发环境搭建2.1、安装Qt5.122.2、开始编译ffmpeg 1、MAC开发环境 1.1、安装brew 根据提示&#xff0c;输⼊密码就可以⼀…