99999久久久久久亚洲,欧美人与禽猛交狂配,高清日韩av在线影院,一个人在线高清免费观看,啦啦啦在线视频免费观看www

熱線電話:13121318867

登錄
首頁(yè)精彩閱讀干貨分享 | 用Pyecharts制作炫酷的可視化大屏
干貨分享 | 用Pyecharts制作炫酷的可視化大屏
2021-12-03
收藏

作者:俊欣

來(lái)源:關(guān)于數(shù)據(jù)分析與可視化

前兩篇Pyecharts的文章來(lái)幫我們簡(jiǎn)單的梳理了一下可以用Pyecharts來(lái)繪制哪些圖表之后,本篇文章我們用pyecharts里面的一些組件,將繪制的圖表都組合起來(lái)

干貨分享 | 用Py<a href='/map/echarts/' style='color:#000;font-size:inherit;'>echarts</a>制作炫酷的可視化大屏

首先Grid組件

首先介紹Pyecharts模塊當(dāng)中的Grid組件,使用Grid組件可以很好地將多張圖無(wú)論是上下組合還是左右組合,都能夠很好地拼接起來(lái),我們先來(lái)看第一個(gè)例子

bar = (
    Bar()
    .add_xaxis(Faker.choose())
    .add_yaxis("商家1", Faker.values())
    .add_yaxis("商家2", Faker.values())
    .set_global_opts(title_opts=opts.TitleOpts(title="直方圖"))
)
line = (
    Line()
    .add_xaxis(Faker.choose())
    .add_yaxis("商家1", Faker.values())
    .add_yaxis("商家2", Faker.values())
    .set_global_opts(
        title_opts=opts.TitleOpts(title="折線圖", pos_top="48%"),
        legend_opts=opts.LegendOpts(pos_top="48%"),
    )
)


grid = (
    Grid()
    .add(bar, grid_opts=opts.GridOpts(pos_bottom="60%"))
    .add(line, grid_opts=opts.GridOpts(pos_top="50%"))
    .render("水平組合圖_test.html")
)
干貨分享 | 用Py<a href='/map/echarts/' style='color:#000;font-size:inherit;'>echarts</a>制作炫酷的可視化大屏

我們可以看到兩張圖表被以上下組合的方式拼接起來(lái),當(dāng)然除了上下的拼接以外,我們還可以左右來(lái)拼接,代碼如下

bar = (
    Bar()
    .add_xaxis(Faker.choose())
    .add_yaxis("商家1", Faker.values())
    .add_yaxis("商家2", Faker.values())
    .set_global_opts(title_opts=opts.TitleOpts(title="直方圖"),legend_opts=opts.LegendOpts(pos_left="20%"),)
)
line = (
    Line()
    .add_xaxis(Faker.choose())
    .add_yaxis("商家1", Faker.values())
    .add_yaxis("商家2", Faker.values())
    .set_global_opts(
        title_opts=opts.TitleOpts(title="折線圖", pos_right="5%"),
        legend_opts=opts.LegendOpts(pos_right="20%"),
    )
)


grid = (
    Grid()
    .add(bar, grid_opts=opts.GridOpts(pos_left="60%"))
    .add(line, grid_opts=opts.GridOpts(pos_right="50%"))
    .render("垂直組合圖_test.html")
)
干貨分享 | 用Py<a href='/map/echarts/' style='color:#000;font-size:inherit;'>echarts</a>制作炫酷的可視化大屏

可以看到我們無(wú)論是想上下拼接還是左右拼接,都可以通過(guò)調(diào)整參數(shù)“pos_left”、“pos_right”、“pos_top”以及“pos_bottom”這幾個(gè)參數(shù)來(lái)實(shí)現(xiàn),我們?cè)賮?lái)看一下下面這個(gè)例子,我們也可以將地圖直方圖兩者拼接起來(lái)

bar = (
    Bar()
    .add_xaxis(Faker.choose())
    .add_yaxis("商家1", Faker.values())
    .add_yaxis("商家2", Faker.values())
    .set_global_opts(legend_opts=opts.LegendOpts(pos_left="20%"))
) map = (
    Map()
    .add("商家1", [list(z) for z in zip(Faker.provinces, Faker.values())], "china")
    .set_global_opts(title_opts=opts.TitleOpts(title="地圖-基本示例"))
)


grid = (
    Grid()
    .add(bar, grid_opts=opts.GridOpts(pos_top="50%", pos_right="75%"))
    .add(map, grid_opts=opts.GridOpts(pos_left="60%"))
    .render("地圖+直方圖.html")
)
干貨分享 | 用Py<a href='/map/echarts/' style='color:#000;font-size:inherit;'>echarts</a>制作炫酷的可視化大屏

再談Overlap組件

英文單詞“overlap”的意思是重疊,那么放在這里,也就指的是可以將多張圖合并成一張,那么該怎么結(jié)合才好呢?我們來(lái)看一下下面這個(gè)例子,我們將直方圖折線圖通過(guò)overlap組件組合到一起

v1 = Faker.values()
v2 = Faker.values()
v3 = Faker.values()


bar = (
    Bar()
    .add_xaxis(Faker.provinces)
    .add_yaxis("商家A", v1)
    .add_yaxis("商家B", v2)
    .extend_axis(
        yaxis=opts.AxisOpts(
            axislabel_opts=opts.LabelOpts(formatter="{value} 個(gè)"), interval=20
        )
    )
    .set_series_opts(label_opts=opts.LabelOpts(is_show=False))
    .set_global_opts(
        title_opts=opts.TitleOpts(title="Overlap-bar+line"),
        yaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(formatter="{value} 個(gè)")),
    )
)


line = Line().add_xaxis(Faker.provinces).add_yaxis("商家C", v3, yaxis_index=1)
bar.overlap(line)
bar.render("直方圖+折線圖Overlap.html")
干貨分享 | 用Py<a href='/map/echarts/' style='color:#000;font-size:inherit;'>echarts</a>制作炫酷的可視化大屏

除此之外,我們也可以將散點(diǎn)圖折線圖合并在一張圖上面,在代碼上就只要將直方圖的代碼替換成散點(diǎn)圖的就行,這邊也就具體不做演示

Grid組件 + Overlap組件相結(jié)合

我們也可以將上面提高的兩個(gè)組件結(jié)合起來(lái)使用,以此來(lái)繪制多條Y軸的直方圖圖表,代碼如下

Bar()
    .add_xaxis(x_data)
    .add_yaxis( "A",
        [具體相關(guān)的數(shù)據(jù)],
        yaxis_index=0,
        color="#d14a61",
    )
    .add_yaxis( "B",
        [具體相關(guān)的數(shù)據(jù)],
        yaxis_index=1,
        color="#5793f3",
    )
    .直方圖的全局配置代碼....
    
line = (
    Line()
    .add_xaxis(x_data)
    .add_yaxis( "C",
        [具體相關(guān)的數(shù)據(jù)],
        yaxis_index=2,
        color="#675bba",
        label_opts=opts.LabelOpts(is_show=False),
    )
)


bar.overlap(line)
grid = Grid()
grid.add(bar, opts.GridOpts(pos_left="5%", pos_right="20%"), is_control_axis_index=True)
grid.render("test.html")
干貨分享 | 用Py<a href='/map/echarts/' style='color:#000;font-size:inherit;'>echarts</a>制作炫酷的可視化大屏

分頁(yè)組件Tab

我們?cè)谟肞yecharts繪制了多張圖表之后,可以直接Tab組件將多張圖表連起來(lái),一頁(yè)放一張圖表,具體看下面的例子和代碼,

def bar_datazoom_slider() -> Bar: c = (
        Bar()
        .add_xaxis(Faker.days_attrs)
        .add_yaxis("商家A", Faker.days_values)
        .set_global_opts(
            title_opts=opts.TitleOpts(title="Bar-DataZoom(slider-水平)"),
            datazoom_opts=[opts.DataZoomOpts()],
        )
    ) return c def line_markpoint() -> Line: c = (
        Line()
        .add_xaxis(Faker.choose())
        .add_yaxis( "商家A",
            Faker.values(),
            markpoint_opts=opts.MarkPointOpts(data=[opts.MarkPointItem(type_="min")]),
        )
        .set_global_opts(title_opts=opts.TitleOpts(title="折線圖"))
    ) return c def pie_rosetype() -> Pie: v = Faker.choose()
    c = (
        Pie()
        .add( "",
            [list(z) for z in zip(v, Faker.values())],
            radius=["30%", "75%"],
            center=["25%", "50%"],
            rosetype="radius",
            label_opts=opts.LabelOpts(is_show=False),
        )
        .set_global_opts(title_opts=opts.TitleOpts(title="餅圖-玫瑰圖示例"))
    ) return c
    
tab = Tab()
tab.add(bar_datazoom_slider(), "直方圖")
tab.add(line_markpoint(), "折線圖")
tab.add(pie_rosetype(), "餅圖")
tab.render("tab_base.html")
干貨分享 | 用Py<a href='/map/echarts/' style='color:#000;font-size:inherit;'>echarts</a>制作炫酷的可視化大屏

分別將所繪制的三張圖表放置在三個(gè)頁(yè)面當(dāng)中,通過(guò)pyecharts庫(kù)當(dāng)中的tab串聯(lián)起來(lái)

最后是Page組件

和上面Tab組件不一樣的是,Tab組件是一頁(yè)放一張圖表,有幾張圖表就分成幾頁(yè),而Page組件則是將繪制完成的多張圖表統(tǒng)統(tǒng)放在一張頁(yè)面里面,代碼的改動(dòng)上面也十分的簡(jiǎn)單,只要將上面代碼的Tab部分改成Page()即可,如下

def bar_datazoom_slider() -> Bar: c = (
        Bar()
        .add_xaxis(Faker.days_attrs)
        .add_yaxis("商家A", Faker.days_values)
        .set_global_opts(
            title_opts=opts.TitleOpts(title="Bar-DataZoom(slider-水平)"),
            datazoom_opts=[opts.DataZoomOpts()],
        )
    ) return c def line_markpoint() -> Line: c = (
        Line()
        .add_xaxis(Faker.choose())
        .add_yaxis( "商家A",
            Faker.values(),
            markpoint_opts=opts.MarkPointOpts(data=[opts.MarkPointItem(type_="min")]),
        )
        .set_global_opts(title_opts=opts.TitleOpts(title="折線圖"))
    ) return c def pie_rosetype() -> Pie: v = Faker.choose()
    c = (
        Pie()
        .add( "",
            [list(z) for z in zip(v, Faker.values())],
            radius=["30%", "75%"],
            center=["25%", "50%"],
            rosetype="radius",
            label_opts=opts.LabelOpts(is_show=False),
        )
        .set_global_opts(title_opts=opts.TitleOpts(title="餅圖-玫瑰圖示例"))
    ) return c
    
page = Page(layout=Page.SimplePageLayout)
page.add(
    bar_datazoom_slider(),
    line_markpoint(),
    pie_rosetype(),
)
page.render("page_simple_layout.html")
干貨分享 | 用Py<a href='/map/echarts/' style='color:#000;font-size:inherit;'>echarts</a>制作炫酷的可視化大屏

上圖所示的圖表在頁(yè)面當(dāng)中是不能被挪動(dòng)的,在Page()組件當(dāng)中我們還能夠使得圖表按照我們所想的那樣隨意的挪動(dòng)

## 上面的代碼都一樣, page = Page(layout=Page.DraggablePageLayout)
page.add(
    bar_datazoom_slider(),
    line_markpoint(),
    pie_rosetype(),
)
page.render("page_draggable_layout.html")
干貨分享 | 用Py<a href='/map/echarts/' style='color:#000;font-size:inherit;'>echarts</a>制作炫酷的可視化大屏

寫在最后

本篇文章所用到的繪制的圖表都比較的簡(jiǎn)單,為了可以讓讀者更加容易輕松的上手來(lái)實(shí)踐,本質(zhì)上就是通過(guò)上面提到的幾大組件將繪制好的圖表給串聯(lián)起來(lái)。

數(shù)據(jù)分析咨詢請(qǐng)掃描二維碼

若不方便掃碼,搜微信號(hào):CDAshujufenxi

數(shù)據(jù)分析師資訊
更多

OK
客服在線
立即咨詢
客服在線
立即咨詢
') } function initGt() { var handler = function (captchaObj) { captchaObj.appendTo('#captcha'); captchaObj.onReady(function () { $("#wait").hide(); }).onSuccess(function(){ $('.getcheckcode').removeClass('dis'); $('.getcheckcode').trigger('click'); }); window.captchaObj = captchaObj; }; $('#captcha').show(); $.ajax({ url: "/login/gtstart?t=" + (new Date()).getTime(), // 加隨機(jī)數(shù)防止緩存 type: "get", dataType: "json", success: function (data) { $('#text').hide(); $('#wait').show(); // 調(diào)用 initGeetest 進(jìn)行初始化 // 參數(shù)1:配置參數(shù) // 參數(shù)2:回調(diào),回調(diào)的第一個(gè)參數(shù)驗(yàn)證碼對(duì)象,之后可以使用它調(diào)用相應(yīng)的接口 initGeetest({ // 以下 4 個(gè)配置參數(shù)為必須,不能缺少 gt: data.gt, challenge: data.challenge, offline: !data.success, // 表示用戶后臺(tái)檢測(cè)極驗(yàn)服務(wù)器是否宕機(jī) new_captcha: data.new_captcha, // 用于宕機(jī)時(shí)表示是新驗(yàn)證碼的宕機(jī) product: "float", // 產(chǎn)品形式,包括:float,popup width: "280px", https: true // 更多配置參數(shù)說(shuō)明請(qǐng)參見:http://docs.geetest.com/install/client/web-front/ }, handler); } }); } function codeCutdown() { if(_wait == 0){ //倒計(jì)時(shí)完成 $(".getcheckcode").removeClass('dis').html("重新獲取"); }else{ $(".getcheckcode").addClass('dis').html("重新獲取("+_wait+"s)"); _wait--; setTimeout(function () { codeCutdown(); },1000); } } function inputValidate(ele,telInput) { var oInput = ele; var inputVal = oInput.val(); var oType = ele.attr('data-type'); var oEtag = $('#etag').val(); var oErr = oInput.closest('.form_box').next('.err_txt'); var empTxt = '請(qǐng)輸入'+oInput.attr('placeholder')+'!'; var errTxt = '請(qǐng)輸入正確的'+oInput.attr('placeholder')+'!'; var pattern; if(inputVal==""){ if(!telInput){ errFun(oErr,empTxt); } return false; }else { switch (oType){ case 'login_mobile': pattern = /^1[3456789]\d{9}$/; if(inputVal.length==11) { $.ajax({ url: '/login/checkmobile', type: "post", dataType: "json", data: { mobile: inputVal, etag: oEtag, page_ur: window.location.href, page_referer: document.referrer }, success: function (data) { } }); } break; case 'login_yzm': pattern = /^\d{6}$/; break; } if(oType=='login_mobile'){ } if(!!validateFun(pattern,inputVal)){ errFun(oErr,'') if(telInput){ $('.getcheckcode').removeClass('dis'); } }else { if(!telInput) { errFun(oErr, errTxt); }else { $('.getcheckcode').addClass('dis'); } return false; } } return true; } function errFun(obj,msg) { obj.html(msg); if(msg==''){ $('.login_submit').removeClass('dis'); }else { $('.login_submit').addClass('dis'); } } function validateFun(pat,val) { return pat.test(val); }