從零開始學Python資料分析【17】-- matplotlib(面積圖)

weixin_34249678發表於2018-01-23

前文傳送門:

從零開始學Python資料分析【1】--資料型別及結構

從零開始學Python資料分析【2】-- 數值計算及正規表示式

從零開始學Python資料分析【3】-- 控制流與自定義函式

從零開始學Python資料分析【4】-- numpy

從零開始學Python資料分析【5】-- pandas(序列部分)

從零開始學Python資料分析【6】-- pandas(資料框部分01)

從零開始學Python資料分析【7】-- pandas(資料框部分02)

從零開始學Python資料分析【8】-- pandas(資料框部分03)

從零開始學Python資料分析【9】-- pandas(資料框部分04)

從零開始學Python資料分析【10】-- matplotlib(條形圖)

從零開始學Python資料分析【11】-- matplotlib(餅圖)

從零開始學Python資料分析【12】-- matplotlib(箱線圖)

從零開始學Python資料分析【13】-- matplotlib(直方圖)

從零開始學Python資料分析【14】-- matplotlib(折線圖)

從零開始學Python資料分析【15】-- matplotlib(散點圖)

從零開始學Python資料分析【16】-- matplotlib(雷達圖)

前言


   我們之前寫過一篇文章是關於折線圖的視覺化《從零開始學Python【14】—matplotlib(折線圖)》,一般來說,**折線圖表達的思想是研究某個時間序列的趨勢**。往往一條折線圖可以根據某個**分組變數進行拆分**,比如今年的銷售額可以拆分成各個事業線的貢獻;流量可以拆分為各個渠道;物流總量可以拆分為公路運輸、鐵路運輸、海運和空運。按照這個思路可以將一條折線圖拆分成**多條折線圖**,直觀的發現各個折線圖的趨勢,但遺憾的是**不能得知總量的趨勢**。為了解決這個問題,我們可以**藉助matplotlib中的stackplot函式繪製面積圖**來直觀表達分組趨勢和總量趨勢。

stackplot函式語法及引數含義


stackplot(x,args,*kargs)

  • x指定面積圖的x軸資料

  • *args為可變引數,可以接受任意多的y軸資料,即各個拆分的資料物件

  • ****kargs**為關鍵字引數,可以通過傳遞其他引數來修飾面積圖,如標籤、顏色

可用的關鍵字引數:

labels:以列表的形式傳遞每一塊麵積圖包含的標籤,通過圖例展現

colors:設定不同的顏色填充面積圖

案例分享


   以我國**2017年的物流運輸量為例**,來對比繪製折線圖和麵積圖。這裡將物流運輸量拆分成公路運輸、鐵路運輸和水路運輸,繪圖的對比程式碼見下方所示:
# ========== Python3 + Jupyter ========== ## 匯入第三方模組import pandas as pdimport numpy as npimport matplotlib.pyplot as plt# 設定圖形的顯示風格plt.style.use('ggplot')# 設定中文和負號正常顯示plt.rcParams['font.sans-serif'] = 'Microsoft YaHei'plt.rcParams['axes.unicode_minus'] = False# 讀取資料transport = pd.read_excel('transport.xls')# 窺探資料框的前5行transport.head()# 折線圖的x變數值,即Jan(一月份)到Aug(八月份)8個值N = np.arange(transport.shape[1]-1)# 繪製拆分的折線圖 labels = transport.Index
channel = transport.columns[1:]for i in range(transport.shape[0]):
    plt.plot(N, # x座標
             transport.loc[i,'Jan':'Aug'], # y座標
             label = labels[i], # 新增標籤
             marker = 'o', # 給折線圖新增圓形點
             linewidth = 2 # 設定線的寬度
            )# 新增標題和座標軸標籤plt.title('2017年各運輸渠道的運輸量')
plt.ylabel('運輸量(萬噸)')# 修改x軸的刻度標籤plt.xticks(N,channel)# 剔除圖框上邊界和右邊界的刻度plt.tick_params(top = 'off', right = 'off')# 顯示圖例(即顯示label的效果)   plt.legend(loc = 'best')   
# 顯示圖形plt.show()
1718515-f9e1fb5b3efadd02
image
1718515-a026ce2d7edf2306
image

這就是繪製分組的折線圖思想,雖然折線圖能夠反映各個渠道的運輸量隨月份的波動趨勢,但無法觀察到1月份到8月份的各自總量。接下來我們看看面積圖的展現。

x = N# 將鐵路運輸、公路運輸和水路運輸各月的值提取出來,儲存到y1~y3# 千萬千萬記得,提取出資料框的一列時,需要將序列的資料型別進行強制轉換,否則會報錯y1 = transport.loc[0,'Jan':'Aug'].astype('int')
y2 = transport.loc[1,'Jan':'Aug'].astype('int')
y3 = transport.loc[2,'Jan':'Aug'].astype('int')# 定義各區塊面積的含義colors = ['#ff9999','#9999ff','#cc1234']# 繪製面積圖plt.stackplot(x, # x軸
              y1,y2,y3, # 可變引數,接受多個y
              labels = labels, # 定義各區塊面積的含義
              colors = colors # 設定各區塊的填充色
             )# 新增標題和座標軸標籤plt.title('2017年各運輸渠道的運輸量')
plt.ylabel('累積運輸量(萬噸)')# 修改x軸的刻度plt.xticks(N,channel)# 剔除圖框上邊界和右邊界的刻度plt.tick_params(top = 'off', right = 'off')# 顯示圖例(即顯示labels的效果)  plt.legend(loc = 'upper left')# 顯示圖形plt.show()
1718515-88029410a67c9c0b
image

一個stackplot函式就能解決問題,而且具有很強的定製化。從上面的面積圖就可以清晰的發現兩個方面的資訊,一個是各渠道運輸量的趨勢,另一個是則可以看見各月份的總量趨勢。所以,我們在視覺化的過程中要儘可能的為閱讀者輸出簡單而資訊量豐富的圖形

結語


   OK,關於面積圖的繪製,我們就分享到這裡,但要記得,什麼場景下使用面積圖會更好。如果你有問題,歡迎在公眾號的留言區域表達你的疑問。同時,也歡迎各位朋友繼續轉發與分享文中的內容,讓跟多的人學習和操作。最後,**本文相關的Python指令碼和PDF版本已存放到百度雲盤,可以通過下面的連結獲取:**

連結: https://pan.baidu.com/s/1dF8Lmvv 密碼: uw7y

相關文章