1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        驚嘆,Pyecharts繪制餅圖原來(lái)可以如此漂亮!

        共 14440字,需瀏覽 29分鐘

         ·

        2021-05-21 00:42

        利用Pyecharts玩轉(zhuǎn)餅圖


        餅圖在實(shí)際的可視化要求中是非常常見(jiàn)的,它能夠很好顯示個(gè)體的占比或者數(shù)據(jù)情況。本文中講解的是如何利用 pyecharts 來(lái)繪制各種滿(mǎn)足不同需求的餅圖,包含:

        • 基礎(chǔ)餅圖+改變餅圖位置顏色
        • 環(huán)狀餅圖
        • 內(nèi)嵌餅圖
        • 多餅圖
        • 玫瑰圖

        開(kāi)始之前,先來(lái)看看部分效果:

        注:文末提供本文的源碼獲取方式,供大家練習(xí)

        導(dǎo)入庫(kù)

        本文中使用的還是 pandas+pyecharts 組合,在jupyter notebook 中進(jìn)行繪圖。首先導(dǎo)入所需要的各種庫(kù):

        基礎(chǔ)餅圖

        模擬數(shù)據(jù)

        我們自行模擬了一份消費(fèi)數(shù)據(jù),包含5個(gè)消費(fèi)項(xiàng)目:住宿+餐飲+交通+服裝+紅包,具體數(shù)據(jù)如下:

        # 生成數(shù)據(jù)
        df = pd.DataFrame({"消費(fèi)":["住宿","餐飲","交通","服裝","紅包"],
                           "數(shù)據(jù)":[2580,1300,500,900,1300]
                          })
        df

        將消費(fèi)和數(shù)據(jù)中的具體數(shù)據(jù)轉(zhuǎn)成列表形式:

        繪圖

        代碼的具體解釋見(jiàn)注釋?zhuān)?/p>

        c = (
            Pie()
            .add("", [list(z) for z in zip(x_data, y_data)])   # zip函數(shù)兩個(gè)部分組合在一起list(zip(x,y))-----> [(x,y)]
            .set_global_opts(title_opts=opts.TitleOpts(title="Pie-月度開(kāi)支"))  # 標(biāo)題
            .set_series_opts(label_opts=opts.LabelOpts(formatter=": {c}"))  # 數(shù)據(jù)標(biāo)簽設(shè)置
        )

        c.render_notebook()  

        改變位置和顏色

        上面生成的餅圖是使用 pyecharts 自帶的顏色和位置,有時(shí)候我們需要做下改變:

        現(xiàn)在我們生成的餅圖如下顯示:

        • 顏色變成了我們?cè)O(shè)置的顏色
        • 位置更靠左了
        視頻效果如下:

        改變圖例位置

        數(shù)據(jù)生成

        上面的圖例是水平方向排列的,而且個(gè)數(shù)比較少。如果我們的圖例比較多,需要改成豎直方向,同時(shí)實(shí)現(xiàn)翻頁(yè)滾動(dòng)功能。

        在這里我們使用的是 pyecharts 中自帶的數(shù)據(jù):

        1、Faker.choose() :是用來(lái)生成數(shù)據(jù)標(biāo)簽,有3種不同的取值情況

        2、Faker.values() 是用來(lái)生成具體的數(shù)據(jù),隨機(jī)生成

        繪圖

        還是通過(guò)上面的繪圖方法,加入數(shù)據(jù)同時(shí)添加各種配置項(xiàng):

        視頻效果如下:

        環(huán)狀餅圖

        環(huán)狀餅圖主要是通過(guò) add 方法中的 radius 參數(shù)來(lái)實(shí)現(xiàn)的。實(shí)現(xiàn)過(guò)程如下:

        x_data = ["小明""小紅""張三""李四""王五"]
        y_data = [335310234135548]

        c = (
            Pie(init_opts=opts.InitOpts(width="1600px", height="1000px"))   # 圖形的大小設(shè)置
            .add(
                series_name="訪(fǎng)問(wèn)來(lái)源",
                data_pair=[list(z) for z in zip(x_data, y_data)],
                radius=["15%""50%"],   # 餅圖內(nèi)圈和外圈的大小比例
                center=["30%""40%"],   # 餅圖的位置:左邊距和上邊距
                label_opts=opts.LabelOpts(is_show=True),   # 顯示數(shù)據(jù)和百分比  
            )
            .set_global_opts(legend_opts=opts.LegendOpts(pos_left="left", orient="vertical"))   # 圖例在左邊和垂直顯示
            .set_series_opts(
                tooltip_opts=opts.TooltipOpts(
                    trigger="item", formatter="{a} <br/>: {c} (13ixwwoc3%)"
                ),
            )

        c.render_notebook()

        可以看到圖形的中間是空的

        內(nèi)嵌餅圖

        內(nèi)嵌餅圖是指將兩個(gè)甚至多個(gè)環(huán)狀餅圖放在一起,實(shí)現(xiàn)代碼過(guò)程如下:

        import pyecharts.options as opts
        from pyecharts.charts import Pie
        from pyecharts.globals import ThemeType

        # 內(nèi)部餅圖
        inner_x_data = ["直達(dá)""營(yíng)銷(xiāo)廣告""搜索引擎","產(chǎn)品"]
        inner_y_data = [335679548283]
        inner_data_pair = [list(z) for z in zip(inner_x_data, inner_y_data)]
        # [['直達(dá)', 335], ['營(yíng)銷(xiāo)廣告', 679], ['搜索引擎', 1548], [‘產(chǎn)品’, 283]]

        # 外部環(huán)形(嵌套)
        outer_x_data = ["搜索引擎""郵件營(yíng)銷(xiāo)""直達(dá)""營(yíng)銷(xiāo)廣告""聯(lián)盟廣告""視頻廣告""產(chǎn)品""百度""谷歌","郵件營(yíng)銷(xiāo)""聯(lián)盟廣告"]
        outer_y_data = [335135147102220310234135648251]
        outer_data_pair = [list(z) for z in zip(outer_x_data, outer_y_data)]

        c = (
             # 初始化
            Pie(init_opts=opts.InitOpts(
                width="900px",  # 設(shè)置圖形大小
                height="800px",
                theme=ThemeType.SHINE))  # 選擇主題

            # 內(nèi)部餅圖
            .add(
                series_name="版本3.2.1",  # 圖形名稱(chēng)
                center=["50%""35%"],  # 餅圖位置
                data_pair=inner_data_pair,  # 系列數(shù)據(jù)項(xiàng),格式為 [(key1, value1), (key2, value2)]
                radius=["25%""40%"],  # 餅圖半徑 數(shù)組的第一項(xiàng)是內(nèi)半徑,第二項(xiàng)是外半徑
                label_opts=opts.LabelOpts(position='inner'), # 標(biāo)簽設(shè)置在內(nèi)部
            )

            # 外部嵌套環(huán)形圖
            .add(
                series_name="版本3.2.9",  # 系列名稱(chēng)
                center=["50%""35%"],  # 餅圖位置
                radius=["40%""60%"],  # 餅圖半徑 數(shù)組的第一項(xiàng)是內(nèi)半徑,第二項(xiàng)是外半徑
                data_pair=outer_data_pair, # 系列數(shù)據(jù)項(xiàng),格式為 [(key1, value1), (key2, value2)]

                # 標(biāo)簽配置項(xiàng) 
                label_opts=opts.LabelOpts(
                    position="outside",
                    formatter="{a|{a}}{abg|}\n{hr|}\n {b|: }{c}  {per|13ixwwoc3%}  ",
                    background_color="#eee",
                    border_color="#aaa",
                    border_width=1,
                    border_radius=4,
                    rich={
                        "a": {"color""#999",
                              "lineHeight"22,
                              "align""center"},

                        "abg": {
                            "backgroundColor""#e3e3e3",
                            "width""100%",
                            "align""right",
                            "height"22,
                            "borderRadius": [4400],
                        },


                        "hr": {
                            "borderColor""#aaa",
                            "width""100%",
                            "borderWidth"0.5,
                            "height"0,
                        },

                        "b": {"fontSize"16"lineHeight"33},

                        "per": {
                            "color""#eee",
                            "backgroundColor""#334455",
                            "padding": [24],
                            "borderRadius"2,
                        },
                    },
                ),
            )

            # 全局配置項(xiàng)
            .set_global_opts(
                xaxis_opts = opts.AxisOpts(is_show = False),   #隱藏X軸刻度
                yaxis_opts = opts.AxisOpts(is_show = False),    #隱藏Y軸刻度
                legend_opts = opts.LegendOpts(is_show = True),  #隱藏圖例
                title_opts = opts.TitleOpts(title = None),    #隱藏標(biāo)題
                            )

            # 系統(tǒng)配置項(xiàng)
            .set_series_opts(
                tooltip_opts=opts.TooltipOpts(
                    trigger="item",
                    formatter="{a} <br/>: {c} (13ixwwoc3%)"
                ),
                label_opts=opts.LabelOpts(is_show=True)  # 隱藏每個(gè)觸角標(biāo)簽
            )
        )

        c.render_notebook()
        視頻效果如下:

        多餅圖

        有時(shí)候我們需要將多個(gè)圖形放在一個(gè)大畫(huà)布中,需要用到子圖的制作。

        在下面的代碼中每個(gè) add() 都是一個(gè)圖形的繪制,我們繪制了4個(gè)餅圖;同時(shí)center指定每個(gè)圖形的位置,radius指定每個(gè)餅圖內(nèi)外圈的大小

        c = (
            Pie()
            .add(
                "",
                [list(z) for z in zip(["劇情""其他"], [3070])],
                center=["20%""30%"],  # 位置
                radius=[6080],   # 每個(gè)餅圖內(nèi)外圈的大小
            )
            .add(
                "",
                [list(z) for z in zip(["奇幻""其他"], [4060])],
                center=["55%""30%"],
                radius=[6080],
            )
            .add(
                "",
                [list(z) for z in zip(["愛(ài)情""其他"], [2476])],
                center=["20%""70%"],
                radius=[6080],
            )
            .add(
                "",
                [list(z) for z in zip(["驚悚""其他"], [1189])],
                center=["55%""70%"],
                radius=[6080],
            )
            .set_global_opts(
                title_opts=opts.TitleOpts(title="Pie-多餅圖基本示例"),
                legend_opts=opts.LegendOpts(
                    type_="scroll", pos_top="20%", pos_left="80%", orient="vertical"
                ),
            )
        )

        c.render_notebook()
        視頻效果如下:

        玫瑰圖

        玫瑰圖中每個(gè)部分的大小和粗細(xì)都是不同的

        v = Faker.choose()
        c = (
            Pie()
            .add(
                "",
                [list(z) for z in zip(v, Faker.values())],   # 兩個(gè)值
                radius=["30%""60%"],  # 大小
                center=["25%""50%"],  # 位置
                rosetype="radius",   
                label_opts=opts.LabelOpts(is_show=False),  # 不在圖形上顯示數(shù)據(jù)
            )
            .add(
                "",
                [list(z) for z in zip(v, Faker.values())],
                radius=["30%""60%"],
                center=["75%""50%"],
                rosetype="area",
            )
            .set_global_opts(title_opts=opts.TitleOpts(title="Pie-玫瑰圖示例"))
        )

        c.render_notebook()
        視頻效果如下:




        PS公號(hào)內(nèi)回復(fù)「Python」即可進(jìn)入Python 新手學(xué)習(xí)交流群,一起 100 天計(jì)劃!


        老規(guī)矩,兄弟們還記得么,右下角的 “在看” 點(diǎn)一下,如果感覺(jué)文章內(nèi)容不錯(cuò)的話(huà),記得分享朋友圈讓更多的人知道!

        神秘禮包獲取方式

        識(shí)別文末二維碼,回復(fù):1024

        瀏覽 172
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評(píng)論
        圖片
        表情
        推薦
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            大香蕉久 | 思思热99 | 大鸡巴久久久久久久久 | 毛片在线观看网站 | 高清无码免费视频在线观看 | 免费观看操逼视频网站 | 日韩欧美一区二区三区在线观看 | 人人妻人人妻 | 一级片免费在线看 | 看美女草逼 |