Pyecharts可视化数据大屏实现

前言

  在对数据的掌握及分析变得愈加重要的当今时代,数据可视化作为提高用户对数据的理解程度,创新架构,增进体验的重要一环,一向富有表现力的Python语言应当可以发挥更大作用,优秀的pyechart第三方库即在这样的背景下诞生。


目录

前言

一、数据大屏展示

二、pyecharts是什么?

三、pyecharts可视化大屏的实现步骤

1.制作数据大屏第一个图像(柱形图)

1.1赋值对象与数据、导入库

1.2输出结果的图像

2.制作数据大屏第二个图像(玫瑰图)

1.1导入数据读取以及处理数据结构

1.2画玫瑰图像

3.制作数据大屏第三个图像-微博投票排名条形图

4.制作数据大屏第四个图像-名字热度词云

5.制作数据大屏第五个图像-关系图

6.制作数据大屏第六个图-图形大标题

7.创建page页面,通过bs4调控html页面

1.1关于page

1.2建立bs4调控

总结


提示:以下是本篇文章正文内容,下面案例可供参考

一、数据大屏展示

运行之后存在的html文件,在浏览器查看

Pyecharts可视化数据大屏实现_第1张图片

二、pyecharts是什么?

Echarts是一个由百度开源的商业级数据图表,它是一个纯JavaScript的图表库,可以为用户提供直观生动,可交互,可高度个性化定制的数据可视化图表,赋予了用户对数据进行挖掘整合的能力。

我们即可定义:pyecharts库是一个用于生成  echarts图表的类库。

三、pyecharts可视化大屏的实现步骤

1.制作数据大屏第一个图像(柱形图)

1.1赋值对象与数据、导入库

# 各组组名
name_group = ['陈小春部落','李承铉部落','张晋部落','赵文卓部落']
# 各组个人战得分
score_solo = [275,226,253,241]
# 各组双人合作得分
score_double = [218,231,283,254]
# 各组阵营合作得分
score_group = [827,895,772,803]

# 计算各组总得分
score_total = []
for i,j,k in zip(score_solo,score_double,score_group):
    score_total.append(i+j+k)
score_total

#导入需要的库
from pyecharts import options as opts
from pyecharts.charts import Bar
from pyecharts.globals import ThemeType

bar = (
    Bar(init_opts=opts.InitOpts(width='600px',height='400px',theme=ThemeType.DARK))
    .add_xaxis(name_group)
    .add_yaxis("solo赛",score_solo)
    .add_yaxis("双人赛",score_double)
    .add_yaxis("团体赛",score_group)
    .add_yaxis("总得分",score_total,gap='0%')
    .set_colors(['orange','skyblue','#ff8080', '#76dd0f'])
    .set_global_opts(title_opts=opts.TitleOpts(title="第四次公演各组评分柱形图"))
)

bar.render_notebook()

1.2输出结果的图像

各组评分柱形图

Pyecharts可视化数据大屏实现_第2张图片

2.制作数据大屏第二个图像(玫瑰图)

1.1导入数据读取以及处理数据结构

代码和代码效果如下(示例):

import pandas as pd
data_age = pd.read_excel('./data/披荆斩棘的哥哥年龄排序.xlsx')
data_age

# 加工出姓名和年龄
# 字符串切片方法
data_age['姓名'] = data_age['字段'].agg(lambda x:x.split('(')[0])
# 正则表达式匹配中文和数字
import re
data_age['姓名2'] = data_age['字段'].agg(lambda x:re.findall('[\u4e00-\u9fa5]+',x)[0])
data_age['年龄'] = data_age['字段'].agg(lambda x:int(re.findall('\d+',x)[0]))
data_age

# 年龄数据分箱
data_age['年龄区间'] = pd.cut(data_age['年龄'],
                       bins = [0,30,40,50,60],
                       labels = ['30岁以下','30-40岁','40-50岁','50岁以上'])
data_age

# 年龄区间数量统计
age_counts = data_age['年龄区间'].value_counts()
age_counts

# 数据结构重组
charts_data_age = [z for z in zip(age_counts.index,age_counts.tolist())]
charts_data_age

Pyecharts可视化数据大屏实现_第3张图片

1.2画玫瑰图像

代码如下(示例):

# 画玫瑰图
# from pyecharts import options as opts
from pyecharts.charts import Pie
pie = (
    Pie(init_opts=opts.InitOpts(width="600px", height="400px",theme=ThemeType.DARK)) # 设置背景的大小
    .add(
        series_name = "年龄段", # 必须项
        data_pair = charts_data_age,
        radius=["20%", "50%"], # 设置环的大小
        rosetype="radius", # 设置玫瑰图类型
        label_opts=opts.LabelOpts(formatter="{a}:{b}\n个数:{c}\n占比:{d}%"), # 设置标签内容格式
    )
    .set_global_opts(title_opts=opts.TitleOpts(title="年龄分布玫瑰图"))
)
pie.render_notebook()

pie。render.notebook()查看图像

Pyecharts可视化数据大屏实现_第4张图片

3.制作数据大屏第三个图像-微博投票排名条形图

代码如下(示例):

data_votes = pd.read_excel('./data/披荆斩棘哥哥微博投票.xlsx')
data_votes

# 数据排序,倒过来画图好看点
data_votes = data_votes.sort_values(by='票数',ascending=True)
data_votes

# 数据结构重组
data_votes_x = data_votes['名字'].tolist()
data_votes_y = data_votes['票数'].tolist()

# 画条形图
from pyecharts import options as opts
from pyecharts.charts import Bar

bar2 = (
    Bar(init_opts=opts.InitOpts(width="600px", height="800px",theme=ThemeType.DARK))
    .add_xaxis(data_votes_x)
    .add_yaxis("",
              data_votes_y
              )
    .reversal_axis() # 旋转柱形图方向
    .set_series_opts(label_opts=opts.LabelOpts(position="right")) # 设置数字标签位置
    .set_global_opts(title_opts=opts.TitleOpts(title="微博投票排名条形图"),
                     visualmap_opts=opts.VisualMapOpts(
                                             max_= max(data_votes_y),
                                              min_= min(data_votes_y),
                                              range_color = ['#ffe100','#e82727'],
                                              pos_right='10%',
                                              pos_top='60%',
                                              dimension = 0, # 柱形图需要加
                                             ),
                    )
)
bar2.render_notebook()

该代码运行的效果如下图

Pyecharts可视化数据大屏实现_第5张图片

4.制作数据大屏第四个图像-名字热度词云

需要注意需要导入的库,建议使用镜像下载

代码如下(示例):

import pandas as pd
import jieba
from snownlp import SnowNLP 
import pyecharts.options as opts
from pyecharts.charts import WordCloud

data_comments = pd.read_excel(r'./data/披荆斩棘的哥哥 短评.xlsx')
data_names = pd.read_excel(r'./data/披荆斩棘的哥哥 名字.xlsx')

# 分词
data_comments['分词'] = data_comments['评论'].agg(lambda x:jieba.lcut(x))
data_comments

# 哥哥热度统计函数
def heat_count(name,series):
    count = 0
    for i in series:
        for j in i:
            if j==name:
                count+=1
    return count

data_names['热度'] = data_names['名字'].agg(heat_count,series=data_comments['分词'])
data_names

# 重组成pyecharts的数据结构
data_wordcloud_name = [(i,str(j)) for i,j in zip(data_names['名字'],data_names['热度'])]
data_wordcloud_name

wordcloud = (
    WordCloud(init_opts=opts.InitOpts(width="600px", height="400px",theme=ThemeType.DARK))
    .add(series_name="", 
         data_pair=data_wordcloud_name,
         word_size_range=[15, 45],
         shape = 'diamond'
        )
    .set_global_opts(
        title_opts=opts.TitleOpts(
            title="豆瓣名字热度词云", title_textstyle_opts=opts.TextStyleOpts(font_size=23)
        ),
        tooltip_opts=opts.TooltipOpts(is_show=True),
    )
)
wordcloud.render_notebook()

 Pyecharts可视化数据大屏实现_第6张图片

5.制作数据大屏第五个图像-关系图

代码如下(示例):

先导入需要使用的库

再调用人物的图片网页链接

from pyecharts import options as opts
from pyecharts.charts import Graph

nodes_data = [
    # 图像的调用用网页链接的形式,不要用本地的图片
    opts.GraphNode(name="陈小春", symbol_size=80 , symbol='image://https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fimg1.bsw360.cn%2F2018%2F8%2F15%2F20180815160300524.jpg&refer=http%3A%2F%2Fimg1.bsw360.cn&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=jpeg?sec=1637556514&t=517961cc969ff653781b8426d07c3fa4'),
    opts.GraphNode(name="谢天华", symbol_size=60 , symbol='image://https://ss3.baidu.com/-fo3dSag_xI4khGko9WTAnF6hhy/zhidao/wh%3D680%2C800/sign=2d0c0e83fc36afc30e5937638b29c7fc/18d8bc3eb13533faacc8d06da3d3fd1f41345b72.jpg'),
    opts.GraphNode(name="林晓峰", symbol_size=60 , symbol='image://https://ss3.baidu.com/-fo3dSag_xI4khGko9WTAnF6hhy/baike/s=220/sign=ea33bb5286b1cb133a693b11ed5556da/c2fdfc039245d6880aa46219afc27d1ed31b24ed.jpg'),
    opts.GraphNode(name="GAI周延", symbol_size=60 , symbol='image://https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fb-ssl.duitang.com%2Fuploads%2Fitem%2F201802%2F12%2F20180212190530_aEuhm.jpeg&refer=http%3A%2F%2Fb-ssl.duitang.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=auto?sec=1689234611&t=be7b229cbccfef7de47c6005ecaa6435'),
    opts.GraphNode(name="布瑞吉", symbol_size=40 ,symbol='image://https://img1.baidu.com/it/u=1530721159,2496756648&fm=253&fmt=auto&app=120&f=JPEG?w=627&h=500'),
#     opts.GraphNode(name="赵文卓", symbol_size=80),
#     opts.GraphNode(name="热狗", symbol_size=40),
#     opts.GraphNode(name="刘聪", symbol_size=40),
#     opts.GraphNode(name="张晋", symbol_size=80),
#     opts.GraphNode(name="白举纲", symbol_size=40),
#     opts.GraphNode(name="高瀚宇", symbol_size=40),
]
links_data = [
    opts.GraphLink(source="陈小春", target="GAI周延", value='大哥'),
    opts.GraphLink(source="陈小春", target="谢天华", value='好兄弟'),
    opts.GraphLink(source="陈小春", target="林晓峰", value='好兄弟'),
    opts.GraphLink(source="陈小春", target="布瑞吉", value='喜欢'),
    opts.GraphLink(source="布瑞吉", target="GAI周延", value='小弟弟'),
    opts.GraphLink(source="林晓峰", target="布瑞吉", value='不认识'),
#     opts.GraphLink(source="热狗", target="赵文卓", value='叫我小狗就好'),
#     opts.GraphLink(source="刘聪", target="赵文卓", value='想学功夫'),
#     opts.GraphLink(source="张晋", target="白举纲", value='干爹'),
#     opts.GraphLink(source="张晋", target="高瀚宇", value='干爹'),
]
graph = (
    Graph(init_opts=opts.InitOpts(width="800px", height="600px",theme=ThemeType.DARK))
    .add(
        "",
        nodes_data,
        links = links_data,
#         gravity = 1,
        repulsion=2000, # 斥力
        is_draggable = True,
        edge_symbol = [None, 'arrow'],
        edge_label=opts.LabelOpts(
            is_show=True, position="middle", formatter="{c}",# color='black'
        ),
        label_opts = opts.LabelOpts(font_size=15)
    )
     .set_global_opts(
        title_opts=opts.TitleOpts(
            title="大湾区&勒是雾都关系图", title_textstyle_opts=opts.TextStyleOpts(font_size=23)
        ),
        tooltip_opts=opts.TooltipOpts(is_show=True),
    )
)
graph.render_notebook()

6.制作数据大屏第六个图-图形大标题

代码如下(示例):

from pyecharts.charts import Pie
title = (
    Pie(init_opts=opts.InitOpts(width="600px", height="100px",theme=ThemeType.DARK)) # 不画图,只显示一个标题,用来构成大屏的标题
        .set_global_opts(
        title_opts=opts.TitleOpts(title="披荆斩棘的哥哥数据可视化大屏",
                                  title_textstyle_opts=opts.TextStyleOpts(font_size=30,
#                                                                           color='#FFFFFF',
                                                                         ),
                                  pos_top=10
                                 )
        )
)
title.render_notebook()

7.创建page页面,通过bs4调控html页面

1.1关于page

page组件可以同时展示多个图形

from pyecharts.charts import Page

page = Page()
page.add(
    title,
    bar,
    bar2,
    pie,
    wordcloud,
    graph,
)
# page.render_notebook()
page.render('披荆斩棘的哥哥数据大屏.html') 

1.2建立bs4调控

代码如下(示例):

from bs4 import BeautifulSoup
with open("披荆斩棘的哥哥数据大屏.html", "r+", encoding='utf-8') as html:
    html_bf = BeautifulSoup(html, 'lxml')
    divs = html_bf.select('.chart-container') # 根据css定位标签,选中图像的父节点标签
    divs[0]["style"] = "width:600px;height:100px;position:absolute;top:0px;left:380px;border-style:dashed;border-color:#444444;border-width:0px;"
    divs[1]["style"] = "width:350px;height:270px;position:absolute;top:50px;left:30px;border-style:dashed;border-color:#444444;border-width:2px;"
    divs[2]["style"] = "width:400px;height:550px;position:absolute;top:50px;left:390px;border-style:dashed;border-color:#444444;border-width:2px;"
    divs[3]["style"] = "width:350px;height:270px;position:absolute;top:50px;left:800px;border-style:dashed;border-color:#444444;border-width:2px;"
    divs[4]["style"] = "width:350px;height:270px;position:absolute;top:330px;left:30px;border-style:dashed;border-color:#444444;border-width:2px;"
    divs[5]["style"] = "width:350px;height:270px;position:absolute;top:330px;left:800px;border-style:dashed;border-color:#444444;border-width:2px;"
    
    body = html_bf.find("body") # 根据标签名称定位到body标签
    body["style"] = "background-color:#333333;" # 修改背景颜色
    html_new = str(html_bf) # 将BeautifulSoup对象转换为字符
    html.seek(0, 0) # 光标移动至
    html.truncate() # 删除光标后的所有字符内容
    html.write(html_new) # 将由BeautifulSoup对象转换得到的字符重新写入html文件
    html.close()

 最后就实现出一个完整的可视化数据大屏

总结

  以上就是今天要讲的内容,本文简单介绍了pyecharts的使用,同时在学习pyecharts的过程中巩固了对于数据结构的重组,数据分箱,也建立起了对制作图形的标准型状的要求的高标准,以后会完善自己学习所得的知识。

你可能感兴趣的:(python,数据分析,echarts)