用pyecharts生成儀表盤——將多張圖片彙總到一個頁面,大屏可視化數據展示

(前情提要)我爬了拉勾網搜索“設計”職位的招聘信息,詳見Python爬蟲獲取拉勾網招聘信息並用pyecharts畫了地圖Geo,Map,條形圖,餅圖,詞雲圖以及箱線圖。詳見拉勾網“設計”職位數據分析之用pyecharts畫地圖Geo,Map拉勾網“設計”職位數據分析之用pyecharts畫條形圖Bar拉勾網“設計”職位數據分析之用pyecharts畫餅圖(南丁格爾圖玫瑰圖)Pie拉勾網“設計”職位數據分析之用pyecharts畫詞雲圖拉勾網“設計”職位數據分析之用pyecharts畫箱線圖
接下來,就用pyecharts裏的page,將前面生成的統計圖都彙總 到一個頁面,並生成大屏可視化數據展示。

import json
import pandas as pd
import numpy as np
import jieba
import jieba.analyse
from pyecharts import options as opts 
from pyecharts.charts import Geo,Map,Bar, Line, Page,Pie, Boxplot, WordCloud
from pyecharts.globals import ChartType, SymbolType,ThemeType

我把之前的生成各個統計圖的代碼都寫到函數裏啦,在此就不再贅述了。

#數據分析
#畫各個省市招聘人數塊地圖
def setmap(df):  
        #轉化省份信息
    dfp = pd.read_excel('province.xlsx')
    df_new = pd.merge(df,dfp.loc[:,['city','province']],how='left',on = 'city')
    result=pd.value_counts(df_new['province'])
    resultp=dict(result)
    province = list(resultp.keys())
    values = list(resultp.values())
    valuesint=[]
    for i in values:
        valuesint.append(int(i))
        
    c = (
        Map(init_opts=opts.InitOpts( theme=ThemeType.LIGHT))#設置主題
        .add("各個省市招聘人數", [list(z) for z in zip(province, valuesint)], "china",is_map_symbol_show=False, tooltip_opts=opts.TooltipOpts())
        .set_series_opts(label_opts=opts.LabelOpts(is_show=False))
        .set_global_opts(title_opts=opts.TitleOpts(title="各個省市招聘人數"),
        visualmap_opts=opts.VisualMapOpts(max_=200,is_piecewise = True,#圖例分段顯示
                                          

                                         ))
    )
    
    
    return c


#畫各個省市招聘人數條形圖
def setbar(df):
        #轉化省份信息
    dfp = pd.read_excel('province.xlsx')
    df_new = pd.merge(df,dfp.loc[:,['city','province']],how='left',on = 'city')
    result=pd.value_counts(df_new['province'])
    resultp=dict(result)
    province = list(resultp.keys())
    values = list(resultp.values())
    valuesint=[]
    for i in values:
        valuesint.append(int(i))
        
    c = (
    Bar(init_opts=opts.InitOpts(theme=ThemeType.LIGHT))#設置主題
    .add_xaxis(province)#x軸爲省份
    .add_yaxis("人數",valuesint)#y軸爲人數
    .set_global_opts(title_opts=opts.TitleOpts(title="各個省市招聘人數"))
    .set_series_opts(
            label_opts=opts.LabelOpts(is_show=False),
            #插入平均值線
            markline_opts=opts.MarkLineOpts(data=[opts.MarkLineItem(type_="average", name="平均值"),]),
            #插入最大值最小值點
            markpoint_opts=opts.MarkPointOpts(data=[
                    opts.MarkPointItem(type_="max", name="最大值"),
                    opts.MarkPointItem(type_="min", name="最小值"),
                ])
    )
)
    
    return c


#畫學歷餅圖
def setpai(df):
    result=pd.value_counts(df['education'])
    resulted=dict(result)
    ed = list(resulted.keys())
    edvalues = list(resulted.values())
    edvaluesint=[]
    for i in edvalues:
        edvaluesint.append(int(i))
    
    c = (
        Pie(init_opts=opts.InitOpts(theme=ThemeType.LIGHT))
        .add(
            "",
            [list(z) for z in zip(ed, edvaluesint)],
            radius=["30%", "75%"],
            center=["25%", "50%"],
            rosetype="radius",
            label_opts=opts.LabelOpts(is_show=False),
        )
        .add(
            "",
            [list(z) for z in zip(ed, edvaluesint)],
            radius=["30%", "75%"],
            center=["75%", "50%"],
            rosetype="area",
        )
        .set_global_opts(title_opts=opts.TitleOpts(title="學歷要求"))
    )
    
    return c


#畫不同工作經驗的薪酬分佈箱線圖
def setbox(df):
    #處理薪酬數據

    pattern = '\d+'
    # 將字符串轉化爲列表,薪資取最低值加上區間值得25%,比較貼近現實
    df['salarys'] = df['salary'].str.findall(pattern)
    #
    avg_salary_list = []
    for k in df['salarys']:
        int_list = [int(n) for n in k]
        avg_salary = int_list[0] + (int_list[1] - int_list[0]) / 4
        avg_salary_list.append(avg_salary)
    df['月薪'] = avg_salary_list



    #處理工作年限數據

    df['workYears']=df['workYear'].replace({'應屆畢業生':'1年以下','不限':'1年以下'})
    groupby_workyear=df.groupby(['workYears'])['月薪']
    count_groupby_workyear=groupby_workyear.count()
    count_groupby_workyear=count_groupby_workyear.reindex(['1年以下','1-3年','3-5年','5-10年'])
    a = count_groupby_workyear.index
    dff=[]
    for b in a:
        c=groupby_workyear.get_group(b).values
        dff.append(c)
    c = Boxplot(init_opts=opts.InitOpts(theme=ThemeType.LIGHT))
    c.add_xaxis(['1年以下','1-3年','3-5年','5-10年']).add_yaxis("薪酬k/月", c.prepare_data(dff)
        ).set_global_opts(title_opts=opts.TitleOpts(title="不同工作經驗的薪酬分佈"))
    
    return c


#畫設計類型餅圖
def setrose(df):
    result=pd.value_counts(df['secondType'])
    resultst=dict(result)
    st= list(resultst.keys())
    stvalues = list(resultst.values())
    stvaluesint=[]
    for i in stvalues:
        stvaluesint.append(int(i))
    

    c = (
        Pie(init_opts=opts.InitOpts(theme=ThemeType.LIGHT))
        .add(
            "",
            [
                list(z)
                for z in zip(
                    st ,
                    stvaluesint ,
                )
            ],
            #設置圓心座標
            center=["40%", "57%"],
        )
        .set_global_opts(
            title_opts=opts.TitleOpts(title="設計類型"),
            legend_opts=opts.LegendOpts(
                type_="scroll", pos_left="80%", orient="vertical",pos_top="15%"
            ),
        )
        .set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}"))
    )
    
    return c


#畫崗位需求詞雲圖
def setword(df):
    needs=[]
    for i in df['need']:
        needs.append(i)

    set_need=str(needs).replace('n1',"").replace('n2',"").replace('n3',"").replace('n4',"").replace('n5',"").replace('n6',"").replace('n7',"").replace('n',"")

    cut = jieba.lcut(set_need)
    need_cut=' '.join(cut)
    #設置停止詞,刪除跟崗位需求無關的詞
    stopwords = ['nan','具備','崗位職責','任職','相關','公司','進行','工作','根據','提供','作品','以上學歷','優先','計算','經驗','學歷','上學','熟練','使用','以上',
                 '熟悉','能力','負責','完成','能夠','要求','項目','製作','具有','良好','行業','專業','設計','團隊','崗位','優秀','我們','關注'
                 ,'xa0','產品','軟件','n6','視頻','創意','遊戲','需求','視覺','大專','本科','各種','以及','n7','瞭解','職位','結果'
    ]
    jieba_need = jieba.analyse.extract_tags(set_need, topK=80, withWeight=True)
    jieba_result=[]
    for  i in jieba_need:
        if i[0] not in stopwords:
            jieba_result.append(i)


    c = (
            WordCloud(init_opts=opts.InitOpts(theme=ThemeType.LIGHT))
            .add("", jieba_result, word_size_range=[20, 100],shape=SymbolType.RECT)
            .set_global_opts(title_opts=opts.TitleOpts(title="崗位需求"))
        )

   
    return c

下面重點來了,首先需要保證你的pyecharts版本在1.4以上,我這裏安裝了最新版本的pip install pyecharts==1.7.1,還有page = Page(layout=Page.DraggablePageLayout)記住這句話是關鍵信息!

df = pd.read_excel('lagou_sj.xlsx')
page = Page(layout=Page.DraggablePageLayout)
page.add(setword(df),setrose(df),setbox(df),setpai(df),setbar(df),setmap(df))
page.render("test.html")

這時候打開保存好的"test.html"文件,大概是這個樣子(我稍微壓縮了一下,不然截圖不方便)test.html
你會看到有很多虛線的方格,這些模塊就是我們之前生成的統計圖,接下來就是見證你的美術(拼圖)功底的時候啦,點擊鼠標可以放大縮小,拖動位置,把這些圖片排成你喜歡的亞子。
拼圖
之後一定要點一下左上角的Save Config按鈕,會自動下載一個保存了你剛纔設置的json,再用這個文件“格式化”你的page並保存

Page.save_resize_html("test.html", 
	cfg_file="chart_config.json",
 	dest="my_test.html")

補充強調一下,我是用jupyter notebook寫的代碼,可以一行一行運行所以沒有注意到,如果用別的IDE的小夥伴,運行Page.save_resize_html之前,一定要把前面的page.render("test.html")這句註釋掉啊!!!

df = pd.read_excel('lagou_sj.xlsx')
page = Page(layout=Page.DraggablePageLayout)
page.add(setword(df),setrose(df),setbox(df),setpai(df),setbar(df),setmap(df))
#page.render("test.html")
Page.save_resize_html("test.html", 
	cfg_file="chart_config.json",
 	dest="my_test.html")

my_test.html
這就是我們最終的結果啦,我還做了一個底色是黑色的(在生成每張統計圖的時候設置一下主題,其他環節都是一樣滴)黑色底色
另外還可以通過修改其他參數來調整最後的html,不過涉及到前端的知識,我就不在這裏班門弄斧啦。本次的關於『拉勾網“設計”職位數據分析』系列到這裏就告一段落啦,主要是爲了記錄一下自己學習的心路歷程,有不足之處還望各位大神多多包涵,多多交流
筆芯

本文學習了@烏 鴉 坐 飛 機 大神的pyecharts實現新冠肺炎疫情可視化並搭建BI數據大屏(Plus),小夥伴們也可以移步去那裏學習鴨

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章