這是一個自寫庫系列,即筆者在數據可視化路上踩過的坑的彙總,並自定義函數和傳入參數來實現快速避坑 + 快速繪製出複雜精美的圖片。
引言
Python 的繪圖功能非常強大,如果能將已有的繪圖庫和各種複雜操作彙總在一個自己寫的庫/包中,並實現一行代碼就調用並實現複雜的繪圖功能,那就更強大了。所以本博文只強調繪圖代碼的實現,繪圖中的統計學知識(名義變量,數值變量,xx圖與xx圖的區別等等)與 Python 基礎庫操作(seaborn,matplotlib)並不會提及,不過也歡迎關注,後續會有更多更廣更豐富的知識瘋狂輸出。
使用方法 & 實現效果
細節圖
爲什麼說樹形圖 treemap 是餅圖的升級版呢? 先來看看餅圖效果吧!
不難看出,我們的目的是對北京幾個地區數據數目進行一個直觀的可視化,餅圖顏色會有點殺馬特(需要另外調整),佔比需要顯式設置;反觀樹形圖,佔比不用設置,方塊大小一目瞭然,數量也在每一列別的下面用小括號呈現了,配色也相對柔和。
如果我們一定需要展示佔比情況的話,可以先使用 value_counts() 結合具體參數來觀察一下差別,後再決定是選用水平條形圖,垂直條形圖,餅圖,還是什麼堆疊面積圖之類的來繪製,這裏指明一個快捷的有點騷的技巧。初識 pandas 者肯定都知道大名鼎鼎的 value_counts() ,但如果我們能在括號中添加兩個小小的細節感滿滿的參數,效果就真的大不一樣了,請看下圖
明顯可以看出,升級版 value_counts() 也就是添加了三個參數的 value_counts()還是有明顯的變化的
- 有時候數目大,希望看出佔比情況而不是隻是顯示出數量
- 升降序排列,誰多誰少一目瞭然,還可以直接在後面 .plot() 繪圖
- dropna 參數的添加,避免數據中的空值佔比沒有算進去
隨意畫個圖看下
這是這裏的差別不明顯罷了,所以柱子長短對排名的呈現並不是那麼明顯,以後呈現的商業實戰就會賊明顯了
代碼展示!!
代碼中的註釋已經非常非常詳細了!希望能夠幫你規避畫圖中的各種坑。繪圖代碼並不是自己創作的,而是從前人(創造繪圖庫的人)和各種大神的代碼中學習並積累下來的,爲了畫出一幅還比較完美的圖,已經踩過無數的坑了,最終通過自己設置函數和函數中的參數來進行自定義的傳參繪製,真的太難了
# 基礎繪圖庫
import matplotlib.pyplot as plt
import seaborn as sns
# %matplotlib inline
# 各種細節配置如 文字大小,圖例文字等雜項
large = 22; med = 16; small = 12
params = {'axes.titlesize': large,
'legend.fontsize': med,
'figure.figsize': (16, 10),
'axes.labelsize': med,
'axes.titlesize': med,
'xtick.labelsize': med,
'ytick.labelsize': med,
'figure.titlesize': large}
plt.rcParams.update(params)
plt.style.use('seaborn-whitegrid')
sns.set_style("white")
plt.rc('font', **{'family': 'Microsoft YaHei, SimHei'}) # 設置中文字體的支持
# sns.set(font='SimHei') # 解決Seaborn中文顯示問題,但會自動添加背景灰色網格
plt.rcParams['axes.unicode_minus'] = False # 解決保存圖像是負號'-'顯示爲方塊的問題
# ====================== 樹形圖:餅圖升級版 =============================
def treemap(data, column, figsize=(12 ,8), title=None, ax=None):
"""
data: 整份數據
column:傳入格式 'col_name'
基準行,求改行各定類變量的個數,並以佔比的情況反映在矩形區域中
"""
import squarify # 這個庫需要 pip install 一下
# Prepare Data
# 下面這行代碼是 pandas 中非常經典的操作,根據選中的名義變量進行分組,
## 分組後求每組的元素數量,並重置索引,新增的索引列爲 counts,可以自己定製
## 這一行代碼可以單獨抽出來嘗試使用並理解
data = data.groupby(column).size().reset_index(name='counts')
# 下面的這三行代碼不用理解,就是在創造 squarify 時大神自己定義的
labels = data.apply(lambda x: str(x[0]) + "\n (" + str(x[1]) + ")", axis=1)
sizes = data['counts'].values.tolist() # 轉成列表
colors = [plt.cm.Spectral( i /float(len(labels))) for i in range(len(labels))]
# Draw Plot
plt.figure(figsize=figsize, dpi= 80) # 設置圖片大小
# 添加標籤,圖中部分元素
squarify.plot(sizes=sizes, label=labels, color=colors, alpha=.8, ax=ax)
# Decorate
plt.title(title)
plt.axis('off') # 關閉座標軸顯示
plt.title(title)
plt.show()
後記
數據分析,商業實踐,數據可視化,網絡爬蟲,統計學,Excel,Word, 社會心理學,認知心理學,行爲科學,民族意志學 各種專欄後續瘋狂補充。
歡迎評論與私信交流!