Python利用matplotlib繪制圓環圖(環形圖)的實戰案例

一、概念介紹

圓環圖(Donut Chart),又稱為環形圖,甜甜圈圖。它從餅圖變形而來,單環的作用上與餅圖相似,用於展示定性數據中小類占大類的比例關系。

Q: 那既然都有餅圖瞭,為什麼還要圓環圖呢?

① 從空間利用效果上,餅圖的text我們常利用指示線標註在每一塊外;而圓環圖憑借中間挖空的優勢,可以將title或者每一塊的text內置,便於多圖排佈對比。

② 從視覺效果上,如果是一維定性的情況,我們隻需要繪制一張餅圖或者圓環圖,這個時候其實兩者沒差。但一旦有兩維數據,餅圖利用角度對比大小的方式其實沒有圓環圖利用長度來得明顯;再者,在多圖對比時,餅圖是完全填充,如果色系選擇不當,很容易給受眾產生厚重的感覺,或者說土土的。

③ 對於復合圖形,旭日圖和雙層環形也是一樣的道理。

圓環圖示例:

二、數據展示

我們目前手上有的是隨機選取的八座城市過去一年每日的空氣質量評級數據(借助爬蟲,源自天氣後報網http://www.tianqihoubao.com/aqi/)。

網頁數據如下:

由於圓環圖要的是定性數據,那我們將質量等級定為可視化對象。我們的目標是:利用圓環圖分析各個城市一年中空氣質量等級分佈的情況。對於收集的數據,利用excel整理如下所示:

接下來,我們導入數據

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
 
df_yh = pd.DataFrame(pd.read_excel('./天氣質量指數.xlsx'))

繪圖所需要的數據結構如下所示:

三、圖像繪制

顯然,我們的數據是二維定性的【城市+空氣質量等級】,如果是要將質量等級作為大類繪制復合圖當然也是可行的,但因為城市比較多,會顯得擁擠。我們這裡選擇的是繪制八幅單圓環再進行排列對比。

plt.rcParams['font.sans-serif'] = 'Microsoft YaHei'
plt.rcParams['axes.unicode_minus'] = False
 
wedgeprops = {'width':0.3, 'edgecolor':'black', 'linewidth':3}
colors = ['#ffda03', '#58bc08','#ff964f' ,'#c875c4' ,'#9a3001']
fig = plt.figure(figsize=(17,9))
for i in range(1,9):
    plt.subplot(2,4,i)
    plt.pie(df_yh.iloc[i-1,1:], wedgeprops=wedgeprops, startangle=90, colors=colors)
    plt.text(0, 0, df_yh['城市'][i-1] , ha='center', va='center', fontsize=22)
# plt.savefig(r'./繪圖結果/圓環圖.png')

繪制結果如下所示:

四、參數解釋

(1) wedgeprops是我們繪圖時的參數字典。

①  ‘width’ — 圓環的寬度,取值范圍為[0,1],值越大時圓環越寬,width=1的繪制結果即為餅圖,如下所示:

② ‘edgecolor' — 邊緣線顏色,包含內環、外環和每一個小類間的分割線。選擇顏色隻要是plt裡有的都行,但盡量選擇深色。

③ ’linewidth' — 邊緣線寬度。取值范圍[0,100+),可以是小數值,值越大線越粗。但具體取多少,大傢可以根據自己的圖形多嘗試幾個數,個人建議是10以內進行調試。

(2) startangle是第一個數據起畫點。

取值可以是實數域上任何的數字,可以為負,也可以為正。0代表正東方向,-90代表正南方向,90代表正北方向。但要註意的是,圖形的繪制按照逆時針方向。

(3) plt.text

我們在這裡用於標註title。

plt(x,y)中的x,y用於坐標定位

ha — Horizontal 水平方向上以標註文本的哪個位置作為中心 可選項為:'center', 'right', 'left'

va — vertical 豎直方向上以標註文本的哪個位置作為中心 可選項為:'top', 'bottom', 'center', 'baseline', 'center_baseline'

為瞭更好理解,我們分別以ha='right', 'left'舉例:

我們可以看到,‘right’並不是指文本位置居右,而是從文本的右部(京)開始在(0,0)繪制。同理,‘left’並不是指文本位置居右,而是從文本的左部(北)開始繪制。

(4) 可以繪制如示例圖一樣的colorbar,或者legend嗎?

plt.legend()可以將pie中擬定的labels進行顯示,即在plt.pie()中增加labels=labels,但同時圖上每個小類都會附帶類標記。如果我們不希望是圖裡標記出哪個部分是優,哪個部分是輕度污染的話,調整如下:

labels = ['優','良','輕度污染','中度污染','重度污染']
wedgeprops = {'width':0.3, 'edgecolor':'black', 'linewidth':3}
colors = ['#ffda03', '#58bc08','#ff964f' ,'#c875c4' ,'#9a3001']
fig = plt.figure(figsize=(5,5))
plt.pie(df_yh.iloc[1,1:], wedgeprops=wedgeprops, startangle=0, colors=colors)
plt.legend(labels,loc='upper left')
plt.text(0, 0, df_yh['城市'][1] , ha='center', va='center', fontsize=22)

 得到的結果即為:

總結

到此這篇關於Python利用matplotlib繪制圓環圖的文章就介紹到這瞭,更多相關Python matplotlib繪制圓環圖內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: