Python數據可視化第 8 講:matplotlib餅圖繪製函數pie

1. pie 函數介紹

pie 函數用戶繪製餅圖。繪製餅圖的數據由參數 x 提供,每個餅圖楔塊的分數區域爲 x/sum(x) 。如果 sum(x)<1,那麼 x 的值直接給出分數區域,數組將不被歸一化,生成的餅圖將有一個大小爲 1-sum(x) 的空楔形。默認情況下,pie 函數從 x 軸開始逆時針繪製餅圖楔塊。pie 函數的調用格式如下:

pie(x, explode, labels, colors,**kwargs)
pie(x)

參數說明:

  • x:標量序列,必須參數,其中元素決定餅圖中楔塊的大小。
  • explode:數組,可選參數,無默認值,如果不是 None,則爲長度爲 len(x) 數組,該數組指定用於偏移每個楔塊的半徑分數。
  • labels:列表,可選參數,無默認值,爲每個楔塊提供標籤的字符串序列。
  • colors:數組,可選參數,無默認值,爲餅圖循環所用的顏色參數序列。如果沒有,將使用當前活動週期中的顏色。
  • autopct:字符串或函數,可選參數,無默認值,如果不是 None,則是用於用數值標記楔塊的字符串或函數。標籤將放在楔塊內部;如果是格式字符串,則標籤爲 fmt%pct;如果是函數,則調用它。
  • pctdistance:浮點型,可選參數,默認值:0.6,每個餅圖楔塊的中心與參數 autoct 生成的文本的開始之間的比率。如果 autoct 爲 None,則忽略。
  • shadow:布爾型,可選參數,默認值:False,在餡餅下面畫一個陰影。
  • radius:浮點型,可選參數,無默認值,餅圖的半徑,如果“半徑”爲None,則將設置爲1。
  • labeldistance,startangle,counterclock,wedgeprops,textprops,center,frame,rotatelabels,patches,texts,autotexts等參數略。

2. pie 函數繪圖示例

2.1 繪製一個基本的餅圖

繪製一個餅圖並加上一些額外的設置。除了基本的餅圖之外,還顯示了一些可選功能:

  1. 切片標籤,即每個餅圖楔塊加上標籤;
  2. 自動標記百分比,每個楔塊所佔百分比;
  3. 用“彈出”偏移指定楔塊;
  4. 陰影設置;
  5. 自定義起始角度;

完整代碼如下:

import matplotlib.pyplot as plt

# step1:準備畫圖的數據
labels = 'Frogs', 'Hogs', 'Dogs', 'Logs'
sizes = [15, 30, 45, 10]
explode = (0, 0.1, 0, 0)  # 控制第二個餅圖楔塊彈出,即Hogs彈出

# step2:手動創建一個figure對象,相當於一個空白的畫布
figure = plt.figure()
# step3:在畫布上添加1個子塊,標定繪圖位置
axes1 = plt.subplot(1, 1, 1)
# step4:繪製餅圖
axes1.pie(sizes, explode=explode, labels=labels, autopct='%1.1f%%',
          shadow=True, startangle=90)
axes1.set_title('Basic pie chart')

# step5:展示
plt.show()

上面代碼的運行結果:

2.2 繪製餅圖並用圖例和註釋標記各個餅塊

  • 首先,定義導入依賴包併爲創建一個帶有子塊的餅圖準備數據和標籤列表。
  • 然後,爲 autoct 參數提供一個函數 func,它將通過顯示絕對值來擴展自動百分比標記;我們根據相對數據和所有值的和來計算百分比。
  • 最後,創建餅圖並存儲返回的對象以備使用。返回元組的第一個返回元素是楔塊列表。那些是 matplotlib.patches.Wedge 文件修補程序,可直接用作圖例的句柄。我們可以使用legend 的 bbox_to_ anchor 錨定參數將 legend 定位到餅圖之外。這裏我們使用軸座標(1,0,0.5,1)和位置“中心左”;即圖例的左中心點將位於邊界框的左中心點,在軸座標中從(1,0)跨越到(1.5,1)。

完整代碼如下:

import matplotlib.pyplot as plt
import numpy as np

# step1:準備畫圖的數據
recipe = ["375 g flour",
          "75 g sugar",
          "250 g butter",
          "300 g berries"]

data = [float(x.split()[0]) for x in recipe]
ingredients = [x.split()[-1] for x in recipe]

# 自定義一個函數,用於計算每個餅塊所佔的百分比,並拼接文本
def func(pct, allvals):
    # 計算百分比
    absolute = int(pct / 100. * np.sum(allvals))
    # 按格式拼接餅塊展示文本
    return "{:.1f}%\n({:d} g)".format(pct, absolute)

# step2:手動創建一個figure對象,相當於一個空白的畫布
figure = plt.figure()
# step3:在畫布上添加1個子塊,標定繪圖位置
axes1 = plt.subplot(1, 1, 1)
# step4:繪製餅圖,通過參數autopct指定的字符串標記楔塊
wedges, texts, autotexts = axes1.pie(data, autopct=lambda pct: func(pct, data),
                                     textprops=dict(color="w"))
# step5:繪製圖例
axes1.legend(wedges, ingredients,
             title="Ingredients",
             loc="center left",
             bbox_to_anchor=(1, 0, 0.5, 1))

# step6:設置餅圖文本格式和標題
plt.setp(autotexts, size=8, weight="bold")
axes1.set_title("Matplotlib bakery: A pie")

# step7:展示
plt.show()

上面代碼的運行結果:

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