
引言
有讀者說〖PyEcharts〗一貼裡的圖美如畫,但是版本是 pyecharts v0.5,用現在 v1.0 來運作會出錯,建議我再寫篇 pyecharts v1.0 的。我最不喜歡讓讀者失望,這不我就來了。
用 v1.0 來運作 v0.5 的代碼是肯定會報錯的,v0.5 和 v1 間不相容,v1 是一個全新的版本。首先來回顧 v0.5 的方法總結。
PyEcharts v0.5 方法總結
對 pyecharts 中的所有原件,都是先建立 (可以帶些必要屬性,比如标題和尺寸),再用 add 方法添加額外屬性。其通用化流程為
object = Object( 必要屬性 )
object.add( 額外屬性 )
在畫圖之前,你應該對那些原件可以幹嘛有個大概印象,比如 Kline 是畫 K 線圖,Heatmap 是畫熱力圖,WordCloud 是圖詞雲圖等等。對于那些裝飾原件所需的必要屬性和額外屬性,上官網一查便知,跟着例子看了解更快。
畫多個坐标系用 Grid 對象;疊加多個原件用 Overlap 對象;随着時間軸展示不同時點的資料關系用 Timeline 對象,等等。
首先用 pip 安裝 pyecharts
pip install pyecharts
複制
引入 pyecharts 并列印出它的版本
import pyecharts as pye
print('pyecharts: %s' % pye.__version__)
複制
pyecharts: 1.3.1
複制
本文首先對比 pyecharts v0.5 和 v1.0 的差別,之後舉三個從簡單到複雜的例子來學習 v1.0 的用法。
1
v0.5 Vs v1.0
引入基本元件
在 v0.5 中,引入 Line (線)、Kline (K 線)、Bar (柱狀圖)、Pie (餅狀圖)、Grid (多坐标系)、Overlap(疊加對象)、Timeline (時間軸輪播圖)、TreeMap (樹狀圖) 和 WordCloud (詞雲圖) 的代碼如下:
from pyecharts
import Line, Kline, Pie,
Grid, Overlap, Timeline,
TreeMap, WordCloud
複制
在 v1.0 中,引入它們(除了 Overlap)的代碼如下:
from pyecharts.charts
import Line, Kline, Pie,
Grid, Timeline,
TreeMap, WordCloud
複制
在 v1.0 中,我們從 pyecharts.charts 中引入元件,而不是從 pyecharts 引入。此外,v1.0 已經沒有用于組合元件的 Overlap 了,它有一種更簡單的組合方法。對于兩個元件,K 線 kline 和線 line,v0.5 和 v1.0 的代碼如下:
v0.5:需要先建立一個 Overlap 對象,再把 kline 和 line 一個個添加進去。
overlap = Overlap()
overlap.add(kline)
overlap.add(line)
v1.0:每個元件都有 overlap() 函數,可以另外元件,比如先建立 kline 再添加 line.
kline.overlap(line)
一切皆配置
在 pyecharts v1.0 中,一切皆配置(options)。配置項有兩種:全局配置項和系列配置項。
全局配置項有以下 16 小項:
系列配置項有以下 14 小項:
配置項越細就能畫出更多細節。在後面幾節我們會重點說明,尤其是全局配置項,它可通過 set_global_options 方法來設定。
引入 pyecharts 裡的 options 代碼如下:
from pyecharts import options as opts
複制
1
K 線圖
資料
首先用 YahooFinancials API 來下載下傳外彙的三年半曆史資料,安裝該 API 用一行代碼:
pip install yahoofinancials
複制
資料的描述如下
- 起始日:2016-01-01
- 終止日:2019-05-13
- 四個外彙:歐元美元、美元日元、美元人民币,英鎊美元
其中貨币用的不是市場常見格式,比如「歐元美元」用 EURUSD=X,而不是 EURUSD,而「美元日元」用 JPY=X 而不是 USDJPY
下面代碼就是從 API 擷取資料:
該 API 傳回結果 FX_daily 是「字典」格式,樣子非常醜陋,感受一下。
資料樣子雖醜,但還滿齊全,畫 K 線需要的開盤價 (open)、最高價 (high)、最低價 (low)、收盤價 (close) 都有。将上面的「原始資料」轉換成 DataFrame,代碼如下:
第 3 行完全是為了 YahooFinancial 裡面的輸入格式準備的。如果 Asset 是加密貨币,直接用其股票代碼;如果 Asset 是匯率,一般參數寫成 EURUSD 或 USDJPY
- 如果是 EURUSD,轉換成 EURUSD=X
- 如果是 USDJPY,轉換成 JPY=X
第 6 行定義好開盤價、收盤價、最低價和最高價的标簽。
第 7 行擷取出一個「字典」格式的資料。
第 8, 9 行用清單解析式 (list comprehension) 将日期和價格擷取出來。
第 11 到 13 行定義一個 DataFrame
- 值為第 9 行得到的 price 清單
- 行标簽為第 8 行得到的 index 清單
- 列标簽為第 6 行定義好的 columns 清單
處理過後的資料格式美如畫,看看 USDCNY。
curr = 'USDCNY'
data = data_converter( FX_daily, curr, 'FX' )
data.head(3).append(data.tail(3))
複制
PyEcharts v0.5
PyEcharts 0.5 裡畫 K 線用到 Kline對象,除此之外我們添加最高價和最低價兩條線 Line 對象,再用 Overlap 對象來「疊加」它們。
第 1-2 行擷取日期和匯率。
第 4 行建立 K 線對象 Kline,設定好标題 "xxx Chart" 和位置 center。第 5-6 行在 Kline 上添加屬性
- 圖例:'K-Line',
- x 坐标軸資料:日期
- y 坐标軸資料:一定要按 [開盤值, 收盤值, 最低值, 最高值] 的順序,之前處理資料特意按這個順序設定 DataFrame 的列标簽的
- x 坐标軸可拉伸:True
- 圖例位置:右邊
- 圖例排序:豎直
- 圖例文字大小:10
第 8 行建立折線對象 Line。第 9-13 行在 Line 上添加兩條折線,一條是最高價,一條是最低價。
第 14 行建立疊加對象 Overlap。第 15-16 行在 Overlap 上分别添加之前的 Kline 和 Line,這樣就把所有對象整合在一起了。
第 17 行如果被運作,該動态圖被生成到 USDCNY Chart.html 網頁檔案裡;如果沒被運作,該動态圖将顯示在 Jupyter Notebook 中。
PyEcharts 1.0
PyEcharts 1.0 裡畫 K 線用到 Kline 對象,除此之外我們添加最高價和最低價兩條線 Line 對象,然後直接把兩條線添加到 K 線上去。
需要把日期轉成 'Y/m/d' 格式,在轉成清單形式。在 v1.0 中,所有資料都需要轉成清單形式。
第 2 行用 Kline() 構造函數生成 K 線對象,然後
- 用 add_xaxis() 來修飾 x 軸(第 3 行)傳入日期清單
- 用 add_yaxis() 來修飾 y 軸(第 4 行)傳入價格清單
- 用 set_global_opts() 來設定全局配置(第 5-16 行),主要配置包括:
- y 軸可縮放,且顔色交錯(第 6-12 行)
- x 軸可縮放(第 13 行)
- 設定标題(第 14 行)
- 資料局域縮放(第 15 行)
第 20 行用 Line() 構造函數生成線對象,然後
- 用 add_xaxis() 來修飾 x 軸(第 21 行)傳入日期清單
- 用 add_yaxis() 來修飾 y 軸(第 22-29 行)傳入最高價清單
- 用 add_yaxis() 來修飾 y 軸(第 30-37 行)傳入最低價清單
- 用 set_global_opts() 來設定全局配置,主要設定資料局域縮放(第 38 行)
在修飾 y 軸時,我們還設定了線的寬度和透明度、已經不列印出 y 軸對應的圖示。
最後将 K 線和兩條線組合在一起,在 notebook 裡展現 (render_notebook)。
在 v1.0 中,通用代碼長得以下這個樣子
obj = (
Object(...)
.add_xaxis(...)
.add_yaxis(...)
.set_global_options(...)
)
其中 Object 可以是任何常見元件,比如 Kline,Line 和 Bar 等等。三點省略号 ... 就代表各種配置了,具體是什麼那就要讀文檔了。
2
股價 K 線圖 + 折線圖
資料
本小節使用 5 個股票資料,描述如下:
- 5 隻股票:AAPL, JD, BABA, FB, GS
- 1 年時期:從 2018-02-26 到 2019-02-26
再加上同時期的标準普爾 500 指數 (SPX),和恐慌指數 (VIX)。資料如下:
stock_data = pd.read_csv( '1Y Stock Data.csv',
parse_dates=[0],
dayfirst=True )
stock_data.head().append(stock_data.tail())
複制
data = pd.read_csv( 'S&P500.csv',
index_col=0,
parse_dates=True,
dayfirst=True )
spx = data[['Adj Close']].loc['2018-02-26':'2019-02-26']
spx.head(3).append(spx.tail(3))
複制
data = pd.read_csv( 'VIX.csv',
index_col=0,
parse_dates=True,
dayfirst=True )
vix = data[['Adj Close']].loc['2018-02-26':'2019-02-26']
vix.head(3).append(vix.tail(3))
複制
PyEcharts v0.5
我們想把蘋果股票的 K 線圖,和 SPX 和 VIX 折線圖放在一起看。如果再用 Overlap 來疊加它們會顯得圖很亂,這時可以借用 pyecharts 裡的 Grid 對象,它是将上面三個圖放在三個坐标系中。
代碼如下:
第 1-5 行用 code 擷取股票資料,并擷取日期和價格。為了畫 K 線,價格數組的列必須按 pyecharts 裡 API 要求的順序 - [開盤價, 收盤價, 最低價, 最高價]。
第 6 -7 行建立 Kline 對象 (标題放左邊),并添加 x 軸資料、y 軸資料和“允許橫軸拉伸”。
第 10 -12 行建立 Line 對象 (标題為 SPX,位置離頂 55%) 并起名為 line1,再添加若幹屬性,比如 y 軸範圍、辨別最小值、允許橫軸拉伸。最關鍵的是 datazoom_xaxis_index=[2,1,0],就說伸縮功能控制三個軸,AAPL 一個,SPX 一個,VIX 一個。這樣拉伸 x 軸三幅子圖可以同時動,非常酷!
第 15 -18 行建立 Line 對象 (标題為 VIX,位置離頂 75%) 并起名為 line2,再添加若幹屬性。
第 20 行建立 Grid 對象,寬 1000,高 600 (這些數值是不斷嘗試看效果設定的)。
第 20-23 行将三幅圖加在 Grid 中,關鍵點是如何設定裡面的 grid_top 和 grid_bottom 裡的百分數而使得圖看起來好看,這個沒有标準的,不停地嘗試到你最終滿意為止。本例中 AAPL 占了 5% 到 50% 的位置,SPX 占了 55% 到 70% 的位置,VIX 占了 75% 到 90% 的位置 (還有 10% 位置留給了拉縮軸)。
第 24 行如果被運作,該動态圖被生成到 APPL&VIX.html 網頁檔案裡;如果沒被運作,該動态圖将顯示在 Jupyter Notebook 中。
從圖上可以看到在 2018 年底 SPX 和 VIX 同時到達最低點和最高點,對應的蘋果 K 線看,在那一點前後蘋果股價有一個大跌和大漲。
PyEcharts v1.0
直接上代碼。
日期和 OLHC 價格所有資料都需要轉成清單形式。
用 Kline() 構造函數生成 K 線對象上節已經講過,需要注意的是第 21 行中的 xaxis_index=[0,1,2],這個設定太關鍵了。本圖含三個子圖
- 蘋果股票的 K 線圖(index 0)
- 标普 500 的折線圖 (index 1)
- 恐慌指數的折線圖 (index 2)
上面設定是 index為 1 和 2 的兩幅圖的資料局部伸縮跟着 index 0 那幅圖,這樣就實作了用一根 x 軸的 slider 可以任意縮放三幅圖的資料。
用 Line() 構造函數生成線對象上節已經講過,需要注意的是第 34 和 54 行,用 MarkPointOpts 選項辨別出 SPX 的最小值和 VIX 的最大值。
第 57 行用 Grid() 構造函數來生成網格對象 grid_chart,用來組合上面的三幅圖。
接下來一個個加上 AAPL K 線(第 69-72 行)、 SPX 折線(第 73-76 行)和 VIX 折線(第 77-80 行),注意裡面 GridOpts 選項裡的位置參數。
最後(第 82 行)在 notebook 裡展現 grid_chart。
3
股價 K 線圖 + 交易量柱狀圖
資料
本小節使用标準普爾 500 指數 (SPX) 在 2018-02-26 到 2019-02-26 的資料。
PyEcharts v1.0
首先整理一下資料,比如将它們轉換成清單形式,等等。
date = pd.to_datetime(data.index).strftime('%Y/%m/%d').tolist()
price = data[['Open','Close','Low','High']].values.tolist()
close = data['Close']
volume = data['Volume'].values.tolist()
複制
先用 Kline() 建構 K 線,這裡面的内容最豐富。
重點:
第 7 行 - 添加用 Hex 字元串表示的紅和綠兩種顔色,對應着 K線漲和跌的顔色。
第 22-37 行 - 添加兩個「資料區域縮放」功能,一個看的到(用滑鼠拉縮圖最下面的 slider),一個看不到(用滑鼠直接在圖中拉縮),并且設定 xaxis_index =[0,1],表示用 K 線圖(index 0)來控制柱狀圖(index 1)。
第 39-46 行 - 将兩幅圖的提示框合并在一起(第 41 行這個設定太牛逼)。
第 57-67 行 - 坐标軸訓示器配置和區域選擇元件配置使得資料和軸可以一起關聯。
再用 Line() 建構兩條移動平均線,沒什麼可說的,用 pandas 裡面的 rolling() 函數計算了 MA5 和 MA20。
再用 Bar() 建構交易量柱狀圖,注意第 112-115 行代碼,這些設定為了不顯示柱狀圖的 x 軸上的資訊。
最後将 K 線圖、兩條移動均線圖和交易量柱狀圖組合。
看效果吧。
4
總結
太累了不想總結了,對 pyecharts v1.0 記着一點就行了:
一切皆配置(options),細節都在裡面。
其他的都可以查文檔,或者在函數中按“shift + tab”來檢視有那些參數。