python根据时间序列画折线图_Python:matplotlib 和 Seaborn 之折线图 (三十七)
折線圖
折線圖是一種很常見(jiàn)的圖形,用于描繪一個(gè)數(shù)字變量相對(duì)于第二個(gè)變量的值的變化趨勢(shì)。在散點(diǎn)圖中,所有數(shù)據(jù)點(diǎn)都會(huì)繪制出來(lái),而在折線圖中,每個(gè)唯一 x 值或 x 值的分箱僅繪制一個(gè)點(diǎn)(就像直方圖一樣)。如果 x 分箱中有多個(gè)觀測(cè)值,那么該點(diǎn)在折線圖中繪制的 y 值將為該數(shù)據(jù)點(diǎn)在分箱中的摘要統(tǒng)計(jì)值(例如均值或中值)。繪制的點(diǎn)用線條連接起來(lái),表示 x 值的序列或相連特性。
如果 x 變量表示時(shí)間,則數(shù)據(jù)折線圖通常稱(chēng)之為時(shí)間序列圖形。通常,在每個(gè)時(shí)間段內(nèi),我們只有一個(gè)觀測(cè)值,例如股票圖表或匯率圖表。雖然 seaborn 函數(shù) tsplot 可以用于時(shí)間序列數(shù)據(jù),但是它很特殊(撰寫(xiě)本頁(yè)面時(shí)為 seaborn 0.8),計(jì)劃會(huì)出現(xiàn)很大的變化。
我們將使用 Matplotlib 的 errorbar 函數(shù)對(duì)數(shù)據(jù)進(jìn)行處理,以便使數(shù)據(jù)變成必要格式。
plt.errorbar(data = df, x = 'num_var1', y = 'num_var2')
如果我們直接將 dataframe 傳入該函數(shù)中,而不考慮數(shù)據(jù)結(jié)構(gòu),那么可能會(huì)遇到上面的混亂情況。該函數(shù)將所有數(shù)據(jù)點(diǎn)都繪制成一個(gè)線條,將 dataframe 第一行的值與最后一行的值相連。為了按照預(yù)期方式創(chuàng)建折線圖,我們需要對(duì)數(shù)據(jù)進(jìn)行額外的處理,以總結(jié)數(shù)據(jù)。
# set bin edges, compute centers
xbin_edges = np.arange(0.5, df['num_var1'].max()+0.25, 0.25)
xbin_centers = (xbin_edges + 0.25/2)[:-1]
# compute statistics in each bin
data_xbins = pd.cut(df['num_var1'], xbin_edges, right = False, include_lowest = True)
y_means = df['num_var2'].groupby(data_xbins).mean()
y_sems = df['num_var2'].groupby(data_xbins).sem()
# plot the summarized data
plt.errorbar(x = xbin_centers, y = y_means, yerr = y_sems)
因?yàn)?x 變量 ('num_var1') 是連續(xù)的,我們首先設(shè)置數(shù)據(jù)分組采用的分箱。除了常見(jiàn)的邊緣之外,還會(huì)計(jì)算每個(gè)分箱的中心,以便稍后繪制出來(lái)。對(duì)于每個(gè)分箱中的數(shù)據(jù)點(diǎn),我們都計(jì)算均值和均值的標(biāo)準(zhǔn)差。注意這里的 cut 函數(shù)調(diào)用和上一部分的不一樣,因?yàn)槲覀儾恍枰?jì)算每個(gè)點(diǎn)的權(quán)重。
上述數(shù)據(jù)摘要的一個(gè)有趣的方面是,隨著 x 值的增大,均值的不確定性也會(huì)增大。但是對(duì)于兩個(gè)最大的數(shù)據(jù)點(diǎn),沒(méi)有誤差條。從默認(rèn)的 errorbar 圖形(或下面的散點(diǎn)圖)可以看出,這是因?yàn)樽詈髢蓚€(gè)分箱分別只有一個(gè)數(shù)據(jù)點(diǎn)。
其他版本
你還可以通過(guò)使用 pandas 的 rolling 方法以滾動(dòng)窗口的形式計(jì)算摘要統(tǒng)計(jì)值,而不是通過(guò)固定分箱計(jì)算摘要統(tǒng)計(jì)值。因?yàn)闈L動(dòng)窗口將通過(guò) dataframe 的序列行進(jìn)行計(jì)算,我們應(yīng)該使用 sort_values 先使 x 值按升序排序。
# compute statistics in a rolling window
df_window = df.sort_values('num_var1').rolling(15)
x_winmean = df_window.mean()['num_var1']
y_median = df_window.median()['num_var2']
y_q1 = df_window.quantile(.25)['num_var2']
y_q3 = df_window.quantile(.75)['num_var2']
# plot the summarized data
base_color = sb.color_palette()[0]
line_color = sb.color_palette('dark')[0]
plt.scatter(data = df, x = 'num_var1', y = 'num_var2')
plt.errorbar(x = x_winmean, y = y_median, c = line_color)
plt.errorbar(x = x_winmean, y = y_q1, c = line_color, linestyle = '--')
plt.errorbar(x = x_winmean, y = y_q3, c = line_color, linestyle = '--')
plt.savefig('L4_C13_Lineplot3.png')
注意,在繪制圖形時(shí),我們可以繪制多條線。如果挨個(gè)地調(diào)用多個(gè) Matplotlib 函數(shù),所有函數(shù)都會(huì)在相同的坐標(biāo)軸上繪制。我們將繪制三個(gè)中央四分位數(shù),并放在散點(diǎn)圖上方,而不是繪制均值和誤差條。
為者常成,行者常至
總結(jié)
以上是生活随笔為你收集整理的python根据时间序列画折线图_Python:matplotlib 和 Seaborn 之折线图 (三十七)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 请在贵网站的根目录下部署一个文件_使用
- 下一篇: python怎么清空屏幕_python如