人生苦短,快學Python!今天給大家介紹Python可視化之環形圖的繪製。
環形圖,也被稱為圓環圖。它在功能上與餅圖相同,只是中間有一個空白,並且能夠同時支持多個統計數據。與標準餅圖相比,環形圖提供了一個更好的數據強度,因為空白中心可以用來顯示額外的、相關的數據。
環形圖使用場景:適合展示分類的佔比情況,不適合展示分類過多(超過9條數據)或者差別不明顯的場景。
在本文中,我們將介紹兩種使用 Matplotlib 繪製環形圖的方法。一種是使用餅圖和參數 wedgeprops 的簡單方法;另一種是使用極坐標軸和水平條形圖的方法[1]。
方法一:餅圖Matplotlib 中沒有繪製環形圖的方法[2],但是我們可以使用參數 wedgeprops 快速轉換餅圖為環形圖。
下面,先繪製一個簡單的讓小號用一個簡單的餅圖。
import matplotlib.pyplot as plt
plt.pie([87,13], startangle=90, colors=['#5DADE2', '#515A5A'])
plt.show()
餅圖接下來,我們我們可以添加參數 wedgeprops ,並定義邊緣的寬度。
fig, ax = plt.subplots(figsize=(6, 6))
ax.pie([87,13],
wedgeprops={'width':0.3},
startangle=90,
colors=['#5DADE2', '#515A5A'])
一個環形圖是不是非常簡單,其實我們還可以添加一些文字,使得我們的數據可視化更有表現力。
fig, ax = plt.subplots(figsize=(6, 6))
wedgeprops = {'width':0.3, 'edgecolor':'black', 'linewidth':3}
ax.pie([87,13], wedgeprops=wedgeprops, startangle=90, colors=['#5DADE2', '#515A5A'])
plt.title('環形圖', fontsize=24, loc='center')
plt.text(0, 0, "87%", ha='center', va='center', fontsize=42)
plt.text(-1.2, -1.2, "來源: Thiago Carvalho", ha='left', va='center', fontsize=12)
帶有詳細信息的環形圖為了支持中文,我們需要增加這兩行Python代碼。
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用來正常顯示中文標籤
plt.rcParams['axes.unicode_minus'] = False # 用來正常顯示負號當我們要顯示簡單的比例時,環形圖特別有用。
然而在我眼中,圓環圖最適合用來展示進度條!而要製作類似進度條一樣的圓環圖,可以可以進一步簡化圖表。
fig, ax = plt.subplots(figsize=(6, 6))
data = [87, 13]
wedgeprops = {'width': 0.3, 'edgecolor': 'black', 'lw': 3}
patches, _ = ax.pie(data, wedgeprops=wedgeprops, startangle=90, colors=['#5DADE2', 'white'])
patches[1].set_zorder(0)
patches[1].set_edgecolor('white')
plt.title('類似進度條的環形圖', fontsize=24, loc='center')
plt.text(0, 0, f"{data[0]}%", ha='center', va='center', fontsiAze=42)
plt.text(-1.2, -1.3, "來源: Thiago Carvalho", ha='left', va='top', fontsize=12)
方法二:條形圖相對於前一個方法,該方案較為複雜,但也提供了更多的自定義選項。
我們先從繪製基礎圖形開始。
fig, ax = plt.subplots(figsize=(6, 6), subplot_kw={'projection':'polar'})
data = 87
startangle = 90
x = (data * pi *2)/ 100
left = (startangle * pi *2)/ 360 # 轉換起始角度
ax.barh(1, x, left=left, height=1, color='#5DADE2')
plt.ylim(-3, 3)如果想製作成前面一樣的進度條,還需要進行更多的操作。
fig, ax = plt.subplots(figsize=(6, 6), subplot_kw={'projection':'polar'})
data = 87
startangle = 90
x = (data * pi *2)/ 100
left = (startangle * pi *2)/ 360 #控制起始位置
plt.xticks([])
plt.yticks([])
ax.spines.clear()
ax.barh(1, x, left=left, height=1, color='#5DADE2')
plt.ylim(-3, 3)
plt.text(0, -3, "87%", ha='center', va='center', fontsize=42)
進度條 - 環形圖使用這種方法的話,我們擁有更多的自定義選擇。比如可以添加多個進度條、定義它們之間的距離等等。
篇幅限制,只顯示部分代碼嗎,完整代碼下載見文末。
# 在末尾標出線條和點來使它們變圓
for i, x in enumerate(xs):
ax.barh(ys[i], x, left=left, height=1, color=colors[i])
ax.scatter(x+left, ys[i], s=350, color=colors[i], zorder=2)
ax.scatter(left, ys[i], s=350, color=colors[i], zorder=2)
plt.ylim(-4, 4)
legend_elements = [Line2D([0], [0], marker='o', color='w', label='Group A', markerfacecolor='#4393E5', markersize=10),
Line2D([0], [0], marker='o', color='w', label='Group B',
markerfacecolor='#43BAE5', markersize=10),
Line2D([0], [0], marker='o', color='w', label='Group C', markerfacecolor='#7AE6EA', markersize=10)]
ax.legend(handles=legend_elements, loc='center', frameon=False)
plt.xticks([])
plt.yticks([])
ax.spines.clear()好了,以上就是今天介紹的兩種使用 Matplotlib 繪製環形圖的方法。
另外,我還看過另外一個騷操作,也就是在餅圖的中心繪製一個白色圓圈,使之變成一個環形圖。