1. 程式人生 > >python 視覺化:欄位各種組合對應的巢狀餅圖

python 視覺化:欄位各種組合對應的巢狀餅圖

先看自定義函式:這是一個最大層數為3的巢狀餅圖,並且輸出3個欄位各種排列對應的巢狀餅圖:

import pandas as pd
import matplotlib.pyplot as plt

def all_nested_pie():
    plt.rcParams['font.sans-serif']                       # 解決餅圖不能輸出中文的問題
    plt.rcParams['figure.autolayout'] = True              # 解決餅圖不能完整儲存的問題(比如因為餅圖太大)

    for i0 in a:
        fig, ax = plt.subplots()
        data0 = df.groupby(i)['income'].sum()
        data0.plot.pie(autopct='%.1f%%')
        ax.set(aspect='equal')                              # 等價於 ax.set(aspect=1)
        plt.savefig('路徑+{}.png'.format(i))                # 儲存餅圖為png格式圖片

            fir i1 in a:
                if i1 != i:
                    size = 0.3
                    fig, ax = plt.subplots()                     # 重新做subplot,不使用上一層級的subplot,也然人易懂
                    data1 = df.groupby([i0 ,i1])['income'].sum() # 可以直接使用上層級的data0
                    data0.plot.pie(ax=ax, autopct='%.1f%%', radius=1-size, wedgeprops=dic(width=size, edgecolor='w'))    
                    data1.plot.pie(ax=ax, autopct='%.1f%%', radius=1, wedgeprops=dic(width=size, edgecolor='w'))
                    ax.set(aspect='equal')
                    plt.savefig('路徑+{}-{}.png'.format(i ,i1))
                    
                    for i2 in a:
                        if i2 != i1 and i2 != i0:
                            fig, ax = plt.subplot()
                            data2 = pd.groupby([i0, i1, i2])['income'].sum()
                            data0.plot.pie(ax=ax, autopct='%.1f%%', radius=1-size, wedgeprops=dic(width=size, edgecolor='w'))
                            data1.plot.pie(ax=ax, autopct='%.1f%%', radius=1, wedgeprops=dic(width=size, edgecolor='w'))
                            data2.plot.pie(ax=ax, radius=1+size, autopct='%.1f%%', wedgeprops=dict(width=size, edgecolor='w'))
                            ax.set(aspect='euqal')
                            plt.savefig('路徑P{}-{}-{}'.format(i0, i1, i2))


if __name__ == 'main':          # 啟動函式
    df = pd.read_csv('路徑+檔名.csv', encoding='gbk', low_memory=False)
    all_nested_pie()
    print('程式執行完畢')        # 提示程式執行完畢

注:

plt全域性設定:

plt.rcParams['figure.dpi'] : 設定輸出圖的解析度,預設解析度100(畫素[6.0, 4.0],圖片尺寸為 600*400);

plt.rcParams['font.size']: 設定餅圖字型(包括autopec和label)的大小

data.plot.pie()屬性區域設定:

pctdistance=: 設定autopct相對於radius的位置,等於1表示在半徑端點;

labeldistance=:設定label相對radius的位置,和pctdistance一樣。