有趣!如何用Python-matplotlib繪製雙層餅圖及環形圖?

(1)

餅圖(pie),即在一個圓圈內分成幾塊,顯示不同數據系列的佔比大小,這也是我們在日常數據的圖形展示中最常用的圖形之一。

在python中常用matplotlib的pie來繪製,基本命令如下所示(python3.X版本):

vals = [1, 2, 3, 4]#創建數據系列fig, ax = plt.subplots()#創建子圖labels = "A", "B", "C", "D"colors = ["yellowgreen", "gold", "lightskyblue", "lightcoral"]explode = (0, 0.1, 0, 0)ax.pie(vals, explode=explode, labels=labels, colors=colors, autopct="%1.1f%%", shadow=True, startangle=90,radius=1.2)ax.set(aspect="equal", title="Pie plot with `ax.pie`")#設置標題以及圖形的對稱plt.show()

上圖是在對餅圖的模塊顏色、標籤、百分比、標題、角度、圓形半徑,以及某一塊凸出(explode)進行設置後,最終呈現的圖形效果。大部分設置來自於pie()函數內,即:

pie(x, explode=None, labels=None,colors=None, autopct=None, pctdistance=0.6,

shadow=False, labeldistance=1.1,startangle=None, radius=None)

對於該函數內各參數的含義,網上資料比比皆是,在這裡不再贅述,大家可以根據自己需求來多次嘗試,設置美化圖形。

(2)

目前matplotlib中尚無雙層餅圖繪製的專門介紹,但是,我們注意到pie()函數中有個餅圖半徑的設置——radius,於是,我就想:可不可以在同一個figure下繪製兩個不同的圓餅,形成嵌套餅圖,從而製作出雙層餅圖?比如:

作圖如下:

vals1 = [1, 2, 3, 4]vals2 = [2, 3, 4, 5]fig, ax = plt.subplots()labels = "A", "B", "C", "D"ax.pie(vals1, radius=1.2)ax.pie(vals2, radius=1)ax.set(aspect="equal", title="Pie plot with `ax.pie`")plt.show()

初戰告捷!令我信心大增!

因此,在matplotlib下繪製雙層餅圖的方法可以總結為:基於不同的數據系列,分別設計兩個餅圖,嵌套在一起,對每個餅圖的pie()函數內參數radius進行設置,就可以得到雙層餅圖。

(3)

但是,可以看到上面的那個圖形還有點粗糙,還可以加入百分比、color等等,進一步設置:

vals1 = [1, 2, 3, 4]vals2 = [2, 3, 4, 5]fig, ax = plt.subplots()labels = "A", "B", "C", "D"ax.pie(vals1, radius=1.2,autopct="%1.1f%%",pctdistance=0.9)ax.pie(vals2, radius=1,autopct="%1.2f%%",pctdistance=0.5)ax.set(aspect="equal", title="Pie plot with `ax.pie`")#plt.legend()plt.legend(labels,bbox_to_anchor=(1.05, 1), loc="best", borderaxespad=0.)plt.show()

為方便,在這裡沒有對顏色、角度進行參數設置,後期若大家有興趣,可以進一步加入不同參數再次設置。在這裡主要說明的是:

1、圖中各餅塊的百分比數據,也在各自餅圖中對pctdistance(百分比離圓形距離)進行不同設置,以便區分開,這裡邊也經過多次嘗試;

2、對於各餅塊顏色代表的數據系列標籤,採用圖例的方式plt.legend(),放在右邊,不然餅圖中展示的文本內容過多,會影響圖形效果;

3、legend()的圖例的位置可以通過關鍵字參數 loc 指定,bbox_to_anchor 關鍵字可讓用戶手動控制圖例布局。例如,如果你希望軸域圖例位於圖像的右上角而不是軸域的邊角,則只需指定角的位置以及該位置的坐標系。

(4)

進一步地,在雙層餅圖的基礎上,我又在想:可不可以繪製雙層環形圖。

在這裡也就是轉換一下思路:在兩個餅圖裡邊再加個小圓形圖,並設置成白色背景。經過嘗試,結果也如我所願:

vals1 = [1, 2, 3, 4]vals2 = [2, 3, 4, 5]vals3=[1]fig, ax = plt.subplots()labels = "A", "B", "C", "D"ax.pie(vals1, radius=1.2,autopct="%1.1f%%",pctdistance=0.9)ax.pie(vals2, radius=1,autopct="%1.1f%%",pctdistance=0.75)ax.pie(vals3, radius=0.6,colors="w")ax.set(aspect="equal", title="Pie plot with `ax.pie`")#plt.legend()plt.legend(labels,bbox_to_anchor=(1, 1), loc="best", borderaxespad=0.)plt.show()

其原理為:繪製三個嵌套餅圖,其中最裡邊的餅圖,設置半徑較小,整個餅圖只有一個變數,因此不會分割,同時將背景色設置成白色colors="w",如此,大功告成!

實際上,還可以進一步延伸,繪製多層餅圖、多層環形圖,其原理都是繪製半徑不同的pie,並設置不同的參數。


推薦閱讀:

10分鐘python圖表繪製 | seaborn入門(一):distplot與kdeplot
用R語言復盤美國總統大選
仿ECO事件圓環圖
左手用R右手Python系列12——空間數據可視化與數據地圖

TAG:Python | Matplotlib | 数据可视化 |