偏差 (Deviation)
面積圖 (Area Chart)
通過對軸和線之間的區域進行着色,面積圖不僅強調峰和谷,而且還強調高點和低點的持續時間。 高點持續時間越長,線下面積越大。
https://datawhalechina.github.io/pms50/#/chapter14/chapter14
導入所需要的庫
import numpy as np # 導入numpy庫 import pandas as pd # 導入pandas庫 import matplotlib as mpl # 導入matplotlib庫 import matplotlib.pyplot as plt import seaborn as sns # 導入seaborn庫
設定圖像各種屬性
large = 22; med = 16; small = 12 params = {'axes.titlesize': large, # 設置子圖上的標題字體 'legend.fontsize': med, # 設置圖例的字體 'figure.figsize': (16, 10), # 設置圖像的畫布 'axes.labelsize': med, # 設置標簽的字體 'xtick.labelsize': med, # 設置x軸上的標尺的字體 'ytick.labelsize': med, # 設置整個畫布的標題字體 'figure.titlesize': large} #plt.rcParams.update(params) # 更新默認屬性 plt.style.use('seaborn-whitegrid') # 設定整體風格 sns.set_style("white") # 設定整體背景風格
程序代碼
# step1:導入數據 df = pd.read_csv("https://github.com/selva86/datasets/raw/master/economics.csv", parse_dates=['date']).head(100) x = np.arange(df.shape[0]) # 創造一個和數據相同長度的序列 y_returns = (df.psavert.diff().fillna(0) / df.psavert.shift(1)).fillna(0) * 100 # 獲取所需要的數據 # step2:繪制面積圖 # 畫布 plt.figure(figsize = (16, 10), # 畫布尺寸 dpi = 80) # 分辨率 # 繪制面積圖 plt.fill_between(x[1:], # 定義x坐標 y_returns[1:], # 定義第一條曲線的縱坐標 0, # 定義第二條曲線的縱坐標 where = y_returns[1:] >= 0, # 被填充的區域 facecolor = 'green', # 被填充的顏色(綠色) interpolate = True, # 交叉點區域的填充 alpha = 0.7) # 被填充區域的透明度 plt.fill_between(x[1:], # 定義x坐標 y_returns[1:], # 定義第一條曲線的縱坐標 0, # 定義第二條曲線的縱坐標 where = y_returns[1:] <= 0, # 被填充的區域 facecolor = 'red', # 被填充的顏色(虹色) interpolate = True, # 交叉點區域的填充 alpha = 0.7) # 被填充區域的透明度 # 添加注釋 plt.annotate('Peak \n1975', # 文本內容 xy = (94.0, 21.0), # 注釋的起始位置 xytext = (88.0, 28), # 文本的起始位置 bbox = dict (boxstyle = 'square', # 箱體的形態為方形 fc = 'firebrick'), # 箱體的顏色 arrowprops = dict(facecolor = 'steelblue', # 箭頭的類型,箭頭的長度,箭頭的寬度 shrink = 0.05), fontsize = 15, # 文本尺寸 color = 'white') # 文本顏色 # step3:裝飾 # 橫坐標 xtickvals = [str(m)[:3].upper() + '-' + str(y) for y,m in zip(df.date.dt.year, df.date.dt.month_name())] # 組合為形如 JUL-1967 plt.gca().set_xticks(x[::6]) # 獲取當前子圖並設置當前子圖的x軸刻度 # x軸刻度標簽 plt.gca().set_xticklabels(xtickvals[::6], # x軸刻度 rotation = 60, # 選擇60度 fontdict = {'horizontalalignment': 'center', # 水平對齊參數 'verticalalignment': 'center_baseline'}) # 垂直對齊參數 # 設置當前y坐標軸的范圍 plt.ylim(-35, 35) # 設置當前x坐標軸的范圍 plt.xlim(1, 100) # 設置圖像標題 plt.title('Month Economics Return %', # 標題名稱 fontsize = 22) # 標題尺寸 # 設置y軸標題 plt.ylabel('Monthly returns %') # 設置網格 plt.grid(alpha = 0.5) plt.show() # 顯示圖像
fill_between()函數總結
matplotlib.pyplot.
fill_between
(x, y1, y2=0, where=None, interpolate=False, step=None, *, data=None, **kwargs)
填充兩條水平曲線之間的區域。
曲線由點定義( x , y1 )和( x , y2 )這將創建一個或多個描述填充區域的多邊形。
默認情況下,邊直接連接給定點。使用 step 如果填充應為階躍函數,即介於 x .
x : 數組(長度n)
定義曲線的節點的X坐標。
y1 : 數組(長度n)或標量
定義第一條曲線的節點的Y坐標。
y2 : 數組(長度n)或標量,可選,默認值:0
定義第二條曲線的節點的Y坐標。
where: bool數組(長度n),可選,默認值:無
定義 where 不填充某些水平區域。填充區域由坐標定義。 x[where]
. 更准確地說,填充 x[i]
和 x[i+1]
如果 where[i] and where[i+1]
. 注意,這個定義意味着 True 介於兩者之間的值 假 價值觀 在哪里? 不會導致填充。兩側 True 位置因相鄰而未填滿 假 價值觀。
interpolate: 可選的布爾
只有當 where兩條曲線相互交叉。
語義上, where 通常用於 y1 > y2 或類似的。默認情況下,定義填充區域的多邊形節點將僅放置在 x數組。這樣的多邊形無法描述接近交集的上述語義。包含交叉點的X形截面僅被剪裁。
設置 interpolate到 True 將計算實際交叉點並將填充區域擴展到此點。
step : 'pre'、'post'、'mid',可選
定義 step 如果填充應為階躍函數,即介於 x . 該值確定步驟的發生位置:
- “pre”:Y值從 x 位置,即間隔
(x[i-1], x[i]]
具有價值y[i]
. - “post”:y值從每個 x 位置,即間隔
[x[i], x[i+1])
具有價值y[i]
. - “mid”:步驟發生在 x 位置。