Python 的繪圖功能非常強大,如果能將已有的繪圖庫的各種復雜操作匯總在一個自己寫的函數甚至是庫/包中,并實現一行代碼就調用并實現復雜的繪圖功能,那就更是如虎添翼。
今天,我們就來講講一學就會的象限圖。
上圖學名叫波士頓矩陣分析圖,大白話四象限圖。這種圖經常用于兩個維度的散點圖中,根據特定的分割線(均值,目標值,實際值等)將數據分為四類,使人一目了然。
常用的場景為分析兩個維度的變化比如:比較商品的庫存天數和庫存周轉率,充值人數和每付費用戶平均收益,購物籃系數和購物籃數量等。
如何使用 Python 畫出此圖是本文的目標,事不宜遲,趕快開始!
任何復雜的 Python 繪圖都不是一蹴而就的,而是先畫出基礎圖形,后在此基礎上按需添加元素并優化而成。這里以一組城市經濟數據為例來講解繪圖步驟:
基礎散點圖
簡潔又樸素的散點圖,僅需一行代碼。離期望成圖還差幾步
- 為每個點添加對應的城市名稱
- 添加特定的分割線(均值,目標值,實際值)
- 背景添加網格
- 一些其他的定制需求...
圖像優化
成圖如下:
從上圖可以看出:
- 廣西,河北,福建三地的人均水平和經濟總量水平都偏低
- 上海的人均經濟水平很高,但經濟總量水平缺只是略優于均值
- 廣東的人均經濟水平稍次于均值,但經濟總量水平很高
- ......
當然,如果我們通過添加數量更多的定制線也可以實現常用的九宮格圖
上圖來自《數據化管理》庫存天數與銷售數量分析
最后總結一下,Python 的一些繪圖方法、參數看似瑣碎,但積累到一定程度后,便可以發現許多技巧都存在共通之處。小事情重復做也會成為大麻煩,所以高手都懂得分類處理。
貫通了 3 個核心,我們才能省時省事,成為別人眼中的高手:
- 大量重復的工作懂得批處理。
- 反復要做的固定操作固化成 " 模板 “,” 套路 "。
- 碰到異常情況,知道如何準確高效的解決。
所以我們可以將四象限圖的繪制方法封裝成自己的函數以供快捷調用,篇幅原因就不多展示了。
上文核心代碼如下:
import matplotlib.pyplot as plt
# 為每個點添加對應的城市名稱
plt.figure(figsize=(10, 8))
# 基礎散點圖:這里需要單獨拆開 x,y 軸和希望配對的標簽,為下面的輪子做準備
x, y = df['經濟總量水平'], df['人均水平']
label = df['area']
plt.scatter(x, y)
plt.xlabel('經濟總量水平'); plt.ylabel('人均水平')
# 對散點圖中的每一個點進行文字標注
## 固定代碼,無需深究,拿來即用
for a,b,l in zip(x,y,label): # zip 拉鏈函數將其配對組合
plt.text(a, b+0.1, '%s.' % l, ha='center', va='bottom',
fontsize=14)
# 0.1 向上輕微偏移
# 添加特定分割線
## vlines: vertical 垂直于 x 軸的線,在變量'經濟總量'的均值處開始畫,
## y 軸的范圍[1.5, 3]
plt.vlines(x=df['經濟總量水平'].mean(), ymin=-1.5, ymax=3,
colors='red', linewidth=2)
plt.hlines(y=df['人均水平'].mean(), xmin=-4, xmax=6,
colors='red', linewidth=2)
# 背景網格
plt.grid(True)
# 定制需求:隱去四周的邊框線條
# sns.despine(trim=True, left=True, bottom=True)
案例中的源數據源代碼可在公眾號 “ 數據分析與商業實踐 ” 后臺回復 “ 象限圖 ” 獲取~~