歡迎閱讀 Python 3+ Matplotlib 系列教程。 在本系列中,我們將涉及 Matplotlib 數(shù)據(jù)可視化模塊的多個方面。 Matplotlib 能夠創(chuàng)建多數(shù)類型的圖表,如條形圖,散點圖,條形圖,餅圖,堆疊圖,3D 圖和地圖圖表。
首先,為了實際使用 Matplotlib,我們需要安裝它。
如果你安裝了更高版本的 Python,你應(yīng)該能夠打開cmd.exe
或終端,然后執(zhí)行:
注意:如果上面的較短命令不工作,你可能需要執(zhí)行C:/Python34/Scripts/pip install matplotlib
。
如果在導(dǎo)入matplotlib
時,你會收到類似『無命名模塊』和模塊名稱的錯誤,這意味著你還需要安裝該模塊。 一個常見的問題是缺少名為six
的模塊。 這意味著你需要使用pip
安裝six
。
或者,你可以前往 Matplotlib.org 并通過訪問下載頁面下載適當?shù)陌姹具M行安裝。 請記住,因為你的操作系統(tǒng)為 64 位,你不一定需要 64 位版本的 Python。 如果你不打算嘗試 64 位,你可以使用 32 位。 打開 IDLE 并閱讀頂部。 如果它說你是 64 位,你就是 64 位,如果它說是 32 位,那么你就是 32 位。 一旦你安裝了 Python,你就做好了準備,你可以編寫任何你想要的邏輯。 我喜歡使用 IDLE 來編程,但你可以隨意使用任何你喜歡的東西。
這一行導(dǎo)入集成的pyplot
,我們將在整個系列中使用它。 我們將pyplot
導(dǎo)入為plt
,這是使用pylot
的 python 程序的傳統(tǒng)慣例。
接下來,我們調(diào)用plot
的.plot
方法繪制一些坐標。 這個.plot
需要許多參數(shù),但前兩個是'x'
和'y'
坐標,我們放入列表。 這意味著,根據(jù)這些列表我們擁有 3 個坐標:1,5
2,7
和3,4
。
plt.plot
在后臺『繪制』這個繪圖,但繪制了我們想要的一切之后,當我們準備好的時候,我們需要把它帶到屏幕上。
這樣,應(yīng)該彈出一個圖形。 如果沒有,有時它可以彈出,或者你可能得到一個錯誤。 你的圖表應(yīng)如下所示:
這個窗口是一個 matplotlib 窗口,它允許我們查看我們的圖形,以及與它進行交互和訪問。 你可以將鼠標懸停在圖表上,并查看通常在右下角的坐標。 你也可以使用按鈕。 它們可能在不同的位置,但在上圖中,這些按鈕在左下角。
Home
(主頁)一旦你開始瀏覽你的圖表,主頁按鈕會幫助你。 如果你想要返回原始視圖,可以單擊它。 在瀏覽圖表之前單擊此按鈕將不會生效。
Forward/Back
(前進/后退)這些按鈕可以像瀏覽器中的前進和后退按鈕一樣使用。 你可以單擊這些來移回到你之前的位置,或再次前進。
Pan
(平移)你可以點擊平移按鈕,之后點擊并拖拽你的圖表。
Zoom
(縮放)縮放按鈕可讓你單擊它,然后單擊并拖動出要放大的方形區(qū)域。 放大需要左鍵單擊并拖動。 你也可以右鍵單擊并拖動來縮小。
Configure Subplots
(配置子圖)此按鈕允許你對圖形和繪圖配置各種間距選項。 點擊它會彈出:
每個藍色條形都是一個滑塊,它允許你調(diào)整內(nèi)邊距。 其中有些現(xiàn)在沒有任何效果,因為沒有任何其他子圖。 前四個值調(diào)整圖形到窗口邊緣的邊距。 之后wspace
和hspace
對應(yīng)于當你繪制多個子圖時,它們的水平或豎直間距。
Save
(保存)此按鈕允許你以各種形式保存圖形。
所以這是 matplotlib 的快速介紹,我們之后會涉及更多。
在本教程中,我們將討論 Matplotlib 中的圖例,標題和標簽。 很多時候,圖形可以不言自明,但是圖形帶有標題,軸域上的標簽和圖例,來解釋每一行是什么非常必要。
注:軸域(
Axes
)即兩條坐標軸圍城的區(qū)域。
從這里開始:
這樣我們可以畫出兩個線條,接下來:
在這里,我們繪制了我們已經(jīng)看到的東西,但這次我們添加另一個參數(shù)label
。 這允許我們?yōu)榫€條指定名稱,我們以后可以在圖例中顯示它。 我們的其余代碼為:
使用plt.xlabel
和plt.ylabel
,我們可以為這些相應(yīng)的軸創(chuàng)建標簽。 接下來,我們可以使用plt.title
創(chuàng)建圖的標題,然后我們可以使用plt.legend()
生成默認圖例。 結(jié)果圖如下:
這個教程中我們會涉及條形圖和直方圖。我們先來看條形圖:
plt.bar
為我們創(chuàng)建條形圖。 如果你沒有明確選擇一種顏色,那么雖然做了多個圖,所有的條看起來會一樣。 這讓我們有機會使用一個新的 Matplotlib 自定義選項。 你可以在任何類型的繪圖中使用顏色,例如g
為綠色,b
為藍色,r
為紅色,等等。 你還可以使用十六進制顏色代碼,如#191970
。
接下來,我們會講解直方圖。 直方圖非常像條形圖,傾向于通過將區(qū)段組合在一起來顯示分布。 這個例子可能是年齡的分組,或測試的分數(shù)。 我們并不是顯示每一組的年齡,而是按照 20 ~ 25,25 ~ 30... 等等來顯示年齡。 這里有一個例子:
產(chǎn)生的圖表為:
對于plt.hist
,你首先需要放入所有的值,然后指定放入哪個桶或容器。 在我們的例子中,我們繪制了一堆年齡,并希望以 10 年的增量來顯示它們。 我們將條形的寬度設(shè)為 0.8,但是如果你想讓條形變寬,或者變窄,你可以選擇其他的寬度。
接下來,我們將介紹散點圖。散點圖通常用于比較兩個變量來尋找相關(guān)性或分組,如果你在 3 維繪制則是 3 個。
散點圖的一些示例代碼:
結(jié)果為:
plt.scatter
不僅允許我們繪制x
和y
,而且還可以讓我們決定所使用的標記顏色,大小和類型。 有一堆標記選項,請參閱 Matplotlib 標記文檔中的所有選項。
在這篇 Matplotlib 數(shù)據(jù)可視化教程中,我們要介紹如何創(chuàng)建堆疊圖。 堆疊圖用于顯示『部分對整體』隨時間的關(guān)系。 堆疊圖基本上類似于餅圖,只是隨時間而變化。
讓我們考慮一個情況,我們一天有 24 小時,我們想看看我們?nèi)绾位ㄙM時間。 我們將我們的活動分為:睡覺,吃飯,工作和玩耍。
我們假設(shè)我們要在 5 天的時間內(nèi)跟蹤它,因此我們的初始數(shù)據(jù)將如下所示:
因此,我們的x
軸將包括day
變量,即 1, 2, 3, 4 和 5。然后,日期的各個成分保存在它們各自的活動中。 像這樣繪制它們:
在這里,我們可以至少在顏色上看到,我們?nèi)绾位ㄙM我們的時間。 問題是,如果不回頭看代碼,我們不知道什么顏色是什么。 下一個問題是,對于多邊形來說,我們實際上不能為數(shù)據(jù)添加『標簽』。 因此,在任何不止是線條,帶有像這樣的填充或堆疊圖的地方,我們不能以固有方式標記出特定的部分。 這不應(yīng)該阻止程序員。 我們可以解決這個問題:
我們在這里做的是畫一些空行,給予它們符合我們的堆疊圖的相同顏色,和正確標簽。 我們還使它們線寬為 5,使線條在圖例中顯得較寬。 現(xiàn)在,我們可以很容易地看到,我們?nèi)绾位ㄙM我們的時間。
餅圖很像堆疊圖,只是它們位于某個時間點。 通常,餅圖用于顯示部分對于整體的情況,通常以%為單位。 幸運的是,Matplotlib 會處理切片大小以及一切事情,我們只需要提供數(shù)值。
在plt.pie
中,我們需要指定『切片』,這是每個部分的相對大小。 然后,我們指定相應(yīng)切片的顏色列表。 接下來,我們可以選擇指定圖形的『起始角度』。 這使你可以在任何地方開始繪圖。 在我們的例子中,我們?yōu)轱瀳D選擇了 90 度角,這意味著第一個部分是一個豎直線條。 接下來,我們可以選擇給繪圖添加一個字符大小的陰影,然后我們甚至可以使用explode
拉出一個切片。
我們總共有四個切片,所以對于explode
,如果我們不想拉出任何切片,我們傳入0,0,0,0
。 如果我們想要拉出第一個切片,我們傳入0.1,0,0,0
。
最后,我們使用autopct
,選擇將百分比放置到圖表上面。
很多時候,我們想要繪制文件中的數(shù)據(jù)。 有許多類型的文件,以及許多方法,你可以使用它們從文件中提取數(shù)據(jù)來圖形化。 在這里,我們將展示幾種方法。 首先,我們將使用內(nèi)置的csv
模塊加載CSV文件,然后我們將展示如何使用 NumPy(第三方模塊)加載文件。
這里,我們打開樣例文件,包含以下數(shù)據(jù):
接下來,我們使用csv
模塊讀取數(shù)據(jù)。 csv
讀取器自動按行分割文件,然后使用我們選擇的分隔符分割文件中的數(shù)據(jù)。 在我們的例子中,這是一個逗號。 注意:csv
模塊和csv reader
不需要文件在字面上是一個.csv文件。 它可以是任何具有分隔數(shù)據(jù)的簡單的文本文件。
一旦我們這樣做了,我們將索引為 0 的元素存儲到x
列表,將索引為 1 的元素存儲到y
列表中。 之后,我們都設(shè)置好了,準備繪圖,然后顯示數(shù)據(jù)。
雖然使用 CSV 模塊是完全正常的,但使用 NumPy 模塊來加載我們的文件和數(shù)據(jù),可能對我們更有意義。 如果你沒有 NumPy,你需要按下面的步驟來獲取它。 為了了解安裝模塊的更多信息,請參閱 pip 教程。 大多數(shù)人應(yīng)該都能打開命令行,并執(zhí)行pip install numpy
。
如果不能,請參閱鏈接中的教程。
一旦你安裝了 NumPy,你可以編寫如下代碼:
結(jié)果應(yīng)該是相同的圖表。 稍后,當我們加載數(shù)據(jù)時,我們可以利用 NumPy 為我們做一些更多的工作,但這是教程未來的內(nèi)容。 就像csv
模塊不需要一個特地的.csv
一樣,loadtxt
函數(shù)不要求文件是一個.txt
文件,它可以是一個.csv
,它甚至可以是一個 python 列表對象。
除了從文件加載數(shù)據(jù),另一個流行的數(shù)據(jù)源是互聯(lián)網(wǎng)。 我們可以用各種各樣的方式從互聯(lián)網(wǎng)加載數(shù)據(jù),但對我們來說,我們只是簡單地讀取網(wǎng)站的源代碼,然后通過簡單的拆分來分離數(shù)據(jù)。
這里有很多步驟。首先,我們看到import
。 pyplot
像往常一樣導(dǎo)入,然后導(dǎo)入了numpy
,然后是用于訪問互聯(lián)網(wǎng)的urllib
,然后導(dǎo)入了matplotlib.dates
作為mdates
,它對于將日期戳轉(zhuǎn)換為 matplotlib 可以理解的日期很有用。
接下來,我們開始構(gòu)建我們的graph_data
函數(shù)。在這里,我們首先定義包含股票數(shù)據(jù)的網(wǎng)址。之后,我們寫一些urllib
代碼來訪問該 URL,然后使用.read
讀取源代碼,之后我們繼續(xù)解碼該數(shù)據(jù)。如果你使用 Python 2,則不必使用decode
。
然后,我們定義一個空列表,這是我們將要放置股票數(shù)據(jù)的地方,我們也開始使用split_source
變量拆分數(shù)據(jù),以換行符拆分。
現(xiàn)在,如果你去看源代碼,用stock
替換 URL 中的+stock+
,像 AAPL 那樣,你可以看到大多數(shù)頁面數(shù)據(jù)確實是股票定價信息,但有一些頭信息我們需要過濾掉。為此,我們使用一些基本的過濾,檢查它們來確保每行有 6 個數(shù)據(jù)點,然后確保術(shù)語values
不在行中。
現(xiàn)在,我們已經(jīng)解析了數(shù)據(jù),并做好了準備。我們將使用 NumPy:
我們在這里所做的是,使用numpy
的loadtxt
函數(shù),并將這六個元素解構(gòu)到六個變量。 這里的第一個參數(shù)是stock_data
,這是我們加載的數(shù)據(jù)。 然后,我們指定delimiter
(這里是逗號),然后我們指定我們確實想要在這里解包變量,不是一個變量,而是我們定義的這組變量。 最后,我們使用可選的converters
參數(shù)來指定我們要轉(zhuǎn)換的元素(0
),以及我們打算要怎么做。 我們傳遞一個名為bytespdate2num
的函數(shù),它還不存在,但我們下面會編寫它。
本教程的重點是將來自 Yahoo finance API 的日期轉(zhuǎn)換為 Matplotlib 可理解的日期。 為了實現(xiàn)它,我們要寫一個新的函數(shù),bytespdate2num
。
此函數(shù)接受數(shù)據(jù),基于編碼來解碼數(shù)據(jù),然后返回它。
將此應(yīng)用于我們的程序的其余部分:
如果你繪制 TSLA,結(jié)果圖應(yīng)該看起來像這樣:
在 Matplotlib 教程中,我們將討論一些可能的圖表自定義。 為了開始修改子圖,我們必須定義它們。 我們很快會談?wù)撍麄?,但有兩種定義并構(gòu)造子圖的主要方法。 現(xiàn)在,我們只使用其中一個,但我們會很快解釋它們。
現(xiàn)在,修改我們的graph_data
函數(shù):
為了修改圖表,我們需要引用它,所以我們將它存儲到變量fig
。 然后我們將ax1
定義為圖表上的子圖。 我們在這里使用subplot2grid
,這是獲取子圖的兩種主要方法之一。 我們將深入討論這些東西,但現(xiàn)在,你應(yīng)該看到我們有 2 個元組,它們提供了(1,1)
和(0,0)
。 1,1
表明這是一個 1×1 網(wǎng)格。 然后0,0
表明這個子圖的『起點』將為0,0
。
接下來,通過我們已經(jīng)編寫的代碼來獲取和解析數(shù)據(jù):
下面,我們這樣繪制數(shù)據(jù):
現(xiàn)在,由于我們正在繪制日期,我們可能會發(fā)現(xiàn),如果我們放大,日期會在水平方向上移動。但是,我們可以自定義這些刻度標簽,像這樣:
這將使標簽轉(zhuǎn)動到對角線方向。 接下來,我們可以添加一個網(wǎng)格:
然后,其它東西我們保留默認,但我們也可能需要略微調(diào)整繪圖,因為日期跑到了圖表外面。 記不記得我們在第一篇教程中討論的configure subplots
按鈕? 我們不僅可以以這種方式配置圖表,我們還可以在代碼中配置它們,以下是我們設(shè)置這些參數(shù)的方式:
現(xiàn)在,為了防止我們把你遺留在某個地方,這里是完整的代碼:
結(jié)果為:
在這個 Matplotlib 教程中,我們將介紹如何處理 unix 時間戳的轉(zhuǎn)換,然后在圖形中繪制日期戳。 使用 Yahoo Finance API,你會注意到,如果你使用較大的時間間隔,如1y
(一年),你會得到我們一直在使用的日期戳,但如果你使用10d
(10 天),反之你會得到 unix 時間的時間戳。
Unix 時間是 1970 年 1 月 1 日以后的秒數(shù),它是跨程序的標準化時間表示方法。 也就是說,Matplotlib 并不歡迎 unix 時間戳。 這里是你可以使用 Matplotlib 來處理 unix 時間的方式:
所以在這里,我們所做的是 unix 時間的寫入處理,并注釋掉我們以前的代碼,因為我們?yōu)橹蟮氖褂枚4嫠?這里的主要區(qū)別是:
這里,我們將時間戳轉(zhuǎn)換為日期戳,然后將其轉(zhuǎn)換為 Matplotlib 想要的時間。
現(xiàn)在,由于某些原因,我的 unix 時間帶有另一行包含 6 個元素的數(shù)據(jù),并且它包含了術(shù)語label
,因此,在我們解析數(shù)據(jù)的for
循環(huán)中,我們?yōu)槟阍偬砑右粋€需要注意的檢查:
現(xiàn)在你的圖表應(yīng)該類似:
這里的所有扁平線條的原因是市場關(guān)閉。 有了這個短期數(shù)據(jù),我們可以得到日內(nèi)數(shù)據(jù)。 所以交易開放時有很多點,然后市場關(guān)閉時就沒有了,然后又是一堆,然后又是沒有。
在本教程中,我們將介紹一些更多的自定義,比如顏色和線條填充。
我們要做的第一個改動是將plt.title
更改為stock
變量。
現(xiàn)在,讓我們來介紹一下如何更改標簽顏色。 我們可以通過修改我們的軸對象來實現(xiàn):
如果我們運行它,我們會看到標簽改變了顏色,就像在單詞中那樣。
接下來,我們可以為要顯示的軸指定具體數(shù)字,而不是像這樣的自動選擇:
接下來,我想介紹填充。 填充所做的事情,是在變量和你選擇的一個數(shù)值之間填充顏色。 例如,我們可以這樣:
所以到這里,我們的代碼為:
結(jié)果為:
填充的一個問題是,我們可能最后會把東西都覆蓋起來。 我們可以用透明度來解決它:
現(xiàn)在,讓我們介紹條件填充。 讓我們假設(shè)圖表的起始位置是我們開始買入 eBay 的地方。 這里,如果價格低于這個價格,我們可以向上填充到原來的價格,然后如果它超過了原始價格,我們可以向下填充。 我們可以這樣做:
會生成:
如果我們想用紅色和綠色填充來展示收益/損失,那么與原始價格相比,綠色填充用于上升(注:國外股市的顏色和國內(nèi)相反),紅色填充用于下跌? 沒問題! 我們可以添加一個where
參數(shù),如下所示:
這里,我們填充當前價格和原始價格之間的區(qū)域,其中當前價格高于原始價格。 我們給予它綠色的前景色,因為這是一個上升,而且我們使用微小的透明度。
我們?nèi)匀徊荒軐Χ噙呅螖?shù)據(jù)(如填充)應(yīng)用標簽,但我們可以像以前一樣實現(xiàn)空線條,因此我們可以:
這向我們提供了一些填充,以及用于處理標簽的空線條,我們打算將其顯示在圖例中。這里完整的代碼是:
現(xiàn)在我們的結(jié)果是:
歡迎閱讀另一個定制教程,在這里我們使用 Matplotlib 討論邊框和水平線條。 有時候你可能想做的事情是改變邊框的顏色,或者甚至完全刪除它們。
圖形的邊框基本上是圖形的邊界,其中有刻度線等東西。為了改變邊框的顏色,你可以做一些類似這樣的事情:
在這里,我們引用了我們的邊框字典,表示我們要調(diào)整左邊框,然后我們使用set_color
方法將顏色設(shè)置為'c'
,它是青色。
如果我們想刪除所有邊框怎么辦? 我們可以這樣做:
這是非常類似的代碼,刪除了右邊框和上邊框。
很難看到我們修改了左邊框的顏色,所以讓我們通過修改線寬來使它變得很明顯:
現(xiàn)在,左邊框變成了非常粗也非常顯眼的青色。 最后,如果我們想修改刻度參數(shù)怎么辦? 假如不想要黑色的日期,我們想要一些橙色的日期? 沒問題!
現(xiàn)在我們的日期是橙色了! 接下來,讓我們來看看我們?nèi)绾卫L制一條水平線。 你當然可以將你創(chuàng)建的一組新數(shù)據(jù)繪制成一條水平線,但你不需要這樣做。 你可以:
所以在這里,我們的整個代碼是:
結(jié)果為:
在 Matplotlib 教程中,我們將介紹如何在 Matplotlib 中創(chuàng)建開,高,低,關(guān)(OHLC)的 K 線圖。 這些圖表用于以精簡形式顯示時間序列股價信息。 為了實現(xiàn)它,我們首先需要導(dǎo)入一些模塊:
我們引入了ticker
,允許我們修改圖表底部的ticker
信息。 然后我們從matplotlib.finance
模塊中引入candlestick_ohlc
功能。
現(xiàn)在,我們需要組織我們的數(shù)據(jù)來和 matplotlib 協(xié)作。 如果你剛剛加入我們,我們得到的數(shù)據(jù)如下:
現(xiàn)在,我們需要構(gòu)建一個 Python 列表,其中每個元素都是數(shù)據(jù)。 我們可以修改我們的loadtxt
函數(shù),使其不解構(gòu),但隨后我們還是希望引用特定的數(shù)據(jù)點。 我們可以解決這個問題,但是我們最后可能只擁有兩個單獨的數(shù)據(jù)集。 為此,我們執(zhí)行以下操作:
有了這個,我們現(xiàn)在將 OHLC 數(shù)據(jù)列表存儲到我們的變量ohlc
。 現(xiàn)在我們可以這樣繪制:
圖表應(yīng)該是這樣:
不幸的是,x
軸上的datetime
數(shù)據(jù)不是日期戳的形式。 我們可以處理它:
此外,紅/黑著色依我看不是最好的選擇。 我們應(yīng)該使用綠色表示上升和紅色表示下降。 為此,我們可以:
最后,我們可以將x
標簽設(shè)置為我們想要的數(shù)量,像這樣:
現(xiàn)在,完整代碼現(xiàn)在是這樣:
結(jié)果為:
還要注意,我們從前面的教程中刪除了大部分ax1
的修改。
在這個 Matplotlib 教程中,我們將討論樣式。 我們用于 Matplotlib 的樣式非常相似于用于 HTML 頁面的 CSS(層疊樣式表)。 正如你在這里可以看到的,我們對圖形所做的所有修改都會疊加,而且我們目前只有一個軸域。 我們可以使用for
循環(huán),至少使代碼量降低,但我們也可以在 Matplotlib 中利用這些樣式。
樣式頁的想法是將自定義樣式寫入文件,然后,為了使用這些更改并將其應(yīng)用于圖形,所有你需要做的就是導(dǎo)入樣式,然后使用該特定樣式。 這樣,讓我們假設(shè)你發(fā)現(xiàn)自己總是改變圖形的各種元素。 你不必為每個圖表編寫 25 ~ 200 行自定義代碼,只需將其寫入一個樣式,然后加載該樣式,并以兩行應(yīng)用所有這些更改即可! 讓我們開始吧。
接下來,我們指定要使用的樣式。 Matplotlib 已經(jīng)有了幾種樣式。
我們可以這樣來使用樣式:
除了標題,標簽的顏色是灰色的,軸域的背景是淺灰色,我們可以立即分辨字體是不同的。 我們還注意到,網(wǎng)格實際上是一個白色的實線。 我們的 K 線圖保持不變,主要是因為我們在事后定制它。 在樣式中加載時,更改會生效,但如果在加載樣式后編寫新的自定義代碼,你的更改也會生效。
因為我們試圖展示樣式模塊,但是讓我們繼續(xù),簡單繪制幾行,并暫且注釋掉 K 線圖:
會生成:
已經(jīng)比默認值好多了!
樣式的另一個例子是fivethirtyeight
:
你可以這樣查看所有的可用樣式:
我這里它提供了['bmh', 'dark_background', 'ggplot', 'fivethirtyeight', 'grayscale']
。
讓我們嘗試dark_background
:
現(xiàn)在,如果你想制作自己的風格呢? 首先,你需要找到樣式目錄。 為了實現(xiàn)它,如果你知道它在哪里,你可以前往你的 matplotlib 目錄,或者你可以找到該目錄。 如果你不知道如何找到該目錄,你可以執(zhí)行以下操作:
這至少會告訴你pyplot
模塊的位置。
在 matplotlib 目錄中,你需要尋找mpl-data
。 然后在那里,你需要尋找stylelib
。 在 Windows 上 ,我的完整路徑是:C:\Python34\Lib\site-packages\matplotlib\mpl-data\stylelib
。
那里應(yīng)該顯示了所有可用的.mplstyle
文件。 你可以編輯、復(fù)制或重命名它們,然后在那里修改為你想要的東西。 然后,無論你用什么來命名.mplstyle
文件,都要放在style.use
中。
在這篇 Matplotlib 教程中,我們將介紹如何創(chuàng)建實時更新圖表,可以在數(shù)據(jù)源更新時更新其圖表。 你可能希望將此用于繪制股票實時定價數(shù)據(jù),或者可以將傳感器連接到計算機,并且顯示傳感器實時數(shù)據(jù)。 為此,我們使用 Matplotlib 的動畫功能。
最開始:
這里,唯一的新增導(dǎo)入是matplotlib.animation as animation
。 這是一個模塊,允許我們在顯示之后對圖形進行動畫處理。
接下來,我們添加一些你熟悉的代碼,如果你一直關(guān)注這個系列:
現(xiàn)在我們編寫動畫函數(shù):
我們在這里做的是構(gòu)建數(shù)據(jù),然后繪制它。 注意我們這里不調(diào)用plt.show()
。 我們從一個示例文件讀取數(shù)據(jù),其內(nèi)容如下:
我們打開上面的文件,然后存儲每一行,用逗號分割成xs
和ys
,我們將要繪制它。 然后:
我們運行動畫,將動畫放到圖表中(fig
),運行animate
的動畫函數(shù),最后我們設(shè)置了 1000 的間隔,即 1000 毫秒或 1 秒。
運行此圖表的結(jié)果應(yīng)該像往常一樣生成圖表。 然后,你應(yīng)該能夠使用新的坐標更新example.txt
文件。 這樣做會生成一個自動更新的圖表,如下:
在本教程中,我們將討論如何向 Matplotlib 圖形添加文本。 我們可以通過兩種方式來實現(xiàn)。 一種是將文本放置在圖表上的某個位置。 另一個是專門注解圖表上的繪圖,來引起注意。
這里的起始代碼是教程 15,它在這里:
所以這里是 Yahoo Finance API 的 eBay 的 OHLC K 線圖。 這里我們要講解的第一件事是向圖形添加文本。
在這里,我們需要做一些事情。 首先,我們使用ax1.text
添加文本。 我們使用我們的數(shù)據(jù),以坐標形式給出此文本的位置。 首先給出文本的坐標,然后給出要放置的實際文本。 接下來,我們使用fontdict
參數(shù)添加一個數(shù)據(jù)字典,來使用所用的字體。 在我們的字體字典中,我們將字體更改為serif
,顏色為『深紅色』,然后將字體大小更改為 15。這將全部應(yīng)用于我們的圖表上的文本,如下所示:
太棒了,接下來我們可以做的是,注解某個特定的繪圖。 我們希望這樣做來給出更多的信息。 在 eBay 的例子中,也許我們想解釋某個具體繪圖,或給出一些關(guān)于發(fā)生了什么的信息。 在股價的例子中,也許有一些發(fā)生的新聞會影響價格。 你可以注解新聞來自哪里,這將有助于解釋定價變化。
這里,我們用ax1.annotate
來注解。 我們首先傳遞我們想要注解的文本,然后傳遞我們讓這個注解指向的坐標。 我們這樣做,是因為當我們注釋時,我們可以繪制線條和指向特定點的箭頭。 接下來,我們指定xytext
的位置。 它可以是像我們用于文本放置的坐標位置,但是讓我們展示另一個例子。 它可以為軸域小數(shù),所以我們使用 0.8 和 0.9。 這意味著文本的位置在x
軸的80%和y
軸的90%處。 這樣,如果我們移動圖表,文本將保持在相同位置。
執(zhí)行它,會生成:
根據(jù)你學習這個教程的時間,所指向的點可能有所不同,這只是一個注解的例子,其中有一些合理的想法,即為什么我們需要注解一些東西。
當圖表啟動時,請嘗試單擊平移按鈕(藍色十字),然后移動圖表。 你會看到文本保持不動,但箭頭跟隨移動并繼續(xù)指向我們想要的具體的點。 這很酷吧!
最后一個圖表的完整代碼:
現(xiàn)在,使用注解,我們可以做一些其他事情,如注解股票圖表的最后價格。 這就是我們接下來要做的。
在這個 Matplotlib 教程中,我們將展示如何跟蹤股票的最后價格的示例,通過將其注解到軸域的右側(cè),就像許多圖表應(yīng)用程序會做的那樣。
雖然人們喜歡在他們的實時圖表中看到歷史價格,他們也想看到最新的價格。 大多數(shù)應(yīng)用程序做的是,在價格的y
軸高度處注釋最后價格,然后突出顯示它,并在價格變化時,在框中將其略微移動。 使用我們最近學習的注解教程,我們可以添加一個bbox
。
我們的核心代碼是:
我們使用ax1.annotate
來放置最后價格的字符串值。 我們不在這里使用它,但我們將要注解的點指定為圖上最后一個點。 接下來,我們使用xytext
將我們的文本放置到特定位置。 我們將它的y
坐標指定為最后一個點的y
坐標,x
坐標指定為最后一個點的x
坐標,再加上幾個點。我們這樣做是為了將它移出圖表。 將文本放在圖形外面就足夠了,但現(xiàn)在它只是一些浮動文本。
我們使用bbox
參數(shù)在文本周圍創(chuàng)建一個框。 我們使用bbox_props
創(chuàng)建一個屬性字典,包含盒子樣式,然后是白色(w
)前景色,黑色(k
)邊框顏色并且線寬為 1。 更多框樣式請參閱 matplotlib 注解文檔。
最后,這個注解向右移動,需要我們使用subplots_adjust
來創(chuàng)建一些新空間:
這里的完整代碼如下:
結(jié)果為:
在這個 Matplotlib 教程中,我們將討論子圖。 有兩種處理子圖的主要方法,用于在同一圖上創(chuàng)建多個圖表。 現(xiàn)在,我們將從一個干凈的代碼開始。 如果你一直關(guān)注這個教程,那么請確保保留舊的代碼,或者你可以隨時重新查看上一個教程的代碼。
首先,讓我們使用樣式,創(chuàng)建我們的圖表,然后創(chuàng)建一個隨機創(chuàng)建示例繪圖的函數(shù):
現(xiàn)在,我們開始使用add_subplot
方法創(chuàng)建子圖:
它的工作原理是使用 3 個數(shù)字,即:行數(shù)(numRows
)、列數(shù)(numCols
)和繪圖編號(plotNum
)。
所以,221 表示兩行兩列的第一個位置。222 是兩行兩列的第二個位置。最后,212 是兩行一列的第二個位置。
譯者注:原文此處表述有誤,譯文已更改。
譯者注:
221
是縮寫形式,僅在行數(shù)乘列數(shù)小于 10 時有效,否則要寫成2,2,1
。
此代碼結(jié)果為:
這就是add_subplot
。 嘗試一些你認為可能很有趣的配置,然后嘗試使用add_subplot
創(chuàng)建它們,直到你感到滿意。
接下來,讓我們介紹另一種方法,它是subplot2grid
。
刪除或注釋掉其他軸域定義,然后添加:
所以,add_subplot
不能讓我們使一個繪圖覆蓋多個位置。 但是這個新的subplot2grid
可以。 所以,subplot2grid
的工作方式是首先傳遞一個元組,它是網(wǎng)格形狀。 我們傳遞了(6,1)
,這意味著整個圖表分為六行一列。 下一個元組是左上角的起始點。 對于ax1
,這是0,0
,因此它起始于頂部。 接下來,我們可以選擇指定rowspan
和colspan
。 這是軸域所占的行數(shù)和列數(shù)。
結(jié)果為:
顯然,我們在這里有一些重疊的問題,我們可以調(diào)整子圖來處理它。
再次,嘗試構(gòu)思各種配置的子圖,使用subplot2grid
制作出來,直到你感到滿意!
我們將繼續(xù)使用subplot2grid
,將它應(yīng)用到我們已經(jīng)逐步建立的代碼中,我們將在下一個教程中繼續(xù)。
在這個 Matplotlib 教程中,我們將處理我們以前教程的代碼,并實現(xiàn)上一個教程中的子圖配置。 我們的起始代碼是這樣:
一個主要的改動是修改軸域的定義:
現(xiàn)在,ax2
是我們實際上在繪制的股票價格數(shù)據(jù)。 頂部和底部圖表將作為指標信息。
在我們繪制數(shù)據(jù)的代碼中,我們需要將ax1
更改為ax2
:
更改之后,代碼為:
結(jié)果為:
在這篇 Matplotlib 教程中,我們介紹了添加一些簡單的函數(shù)來計算數(shù)據(jù),以便我們填充我們的軸域。 一個是簡單的移動均值,另一個是簡單的價格 HML 計算。
這些新函數(shù)是:
你不需要太過專注于理解移動均值的工作原理,我們只是對樣本數(shù)據(jù)來計算它,以便可以學習更多自定義 Matplotlib 的東西。
我們還想在腳本頂部為移動均值定義一些值:
下面,在我們的graph_data
函數(shù)中:
在這里,我們計算兩個移動均值和 HML。
我們還定義了一個『起始』點。 我們這樣做是因為我們希望我們的數(shù)據(jù)排成一行。 例如,20 天的移動均值需要 20 個數(shù)據(jù)點。 這意味著我們不能在第 5 天真正計算 20 天的移動均值。 因此,當我們計算移動均值時,我們會失去一些數(shù)據(jù)。 為了處理這種數(shù)據(jù)的減法,我們使用起始變量來計算應(yīng)該有多少數(shù)據(jù)。 這里,我們可以安全地使用[-start:]
繪制移動均值,并且如果我們希望的話,對所有繪圖進行上述步驟來排列數(shù)據(jù)。
接下來,我們可以在ax1
上繪制 HML,通過這樣:
最后我們可以通過這樣向ax3
添加移動均值:
我們的完整代碼,包括增加我們所用的時間范圍:
代碼效果如圖:
歡迎閱讀另一個 Matplotlib 教程! 在本教程中,我們將清除圖表,然后再做一些自定義。
我們當前的代碼是:
現(xiàn)在我認為向我們的移動均值添加自定義填充是一個很好的主意。 移動均值通常用于說明價格趨勢。 這個想法是,你可以計算一個快速和一個慢速的移動均值。 一般來說,移動均值用于使價格變得『平滑』。 他們總是『滯后』于價格,但是我們的想法是計算不同的速度。 移動均值越大就越『慢』。 所以這個想法是,如果『較快』的移動均值超過『較慢』的均值,那么價格就會上升,這是一件好事。 如果較快的 MA 從較慢的 MA 下方穿過,則這是下降趨勢并且通常被視為壞事。 我的想法是在快速和慢速 MA 之間填充,『上升』趨勢為綠色,然后下降趨勢為紅色。 方法如下:
下面,我們會碰到一些我們可解決的問題:
這里,我們剪切和粘貼ax2
日期格式,然后我們將x
刻度標簽設(shè)置為false
,去掉它們!
我們還可以通過在軸域定義中執(zhí)行以下操作,為每個軸域提供自定義標簽:
接下來,我們可以看到,我們y
刻度有許多數(shù)字,經(jīng)?;ハ喔采w。 我們也看到軸之間互相重疊。 我們可以這樣:
所以,這里發(fā)生的是,我們通過首先將nbins
設(shè)置為 5 來修改我們的y
軸對象。這意味著我們顯示的標簽最多為 5 個。然后我們還可以『修剪』標簽,因此,在我們這里, 我們修剪底部標簽,這會使它消失,所以現(xiàn)在不會有任何文本重疊。 我們?nèi)匀豢赡艽蛩阈藜?code>ax2的頂部標簽,但這里是我們目前為止的源代碼:
當前的源碼:
看起來好了一些,但是仍然有一些東西需要清除。
在這個 Matplotlib 數(shù)據(jù)可視化教程中,我們將討論sharex
選項,它允許我們在圖表之間共享x
軸。將sharex
看做『復(fù)制 x』也許更好。
在我們開始之前,首先我們要做些修剪并在另一個軸上設(shè)置最大刻度數(shù),如下所示:
以及
現(xiàn)在,讓我們共享所有軸域之間的x
軸。 為此,我們需要將其添加到軸域定義中:
上面,對于ax2
和ax3
,我們添加一個新的參數(shù),稱為sharex
,然后我們說,我們要與ax1
共享x
軸。
使用這種方式,我們可以加載圖表,然后我們可以放大到一個特定的點,結(jié)果將是這樣:
所以這意味著所有軸域沿著它們的x
軸一起移動。 這很酷吧!
接下來,讓我們將[-start:]
應(yīng)用到所有數(shù)據(jù),所以所有軸域都起始于相同地方。 我們最終的代碼為:
下面我們會討論如何創(chuàng)建多個y
軸。
在這篇 Matplotlib 教程中,我們將介紹如何在同一子圖上使用多個 Y 軸。 在我們的例子中,我們有興趣在同一個圖表及同一個子圖上繪制股票價格和交易量。
為此,首先我們需要定義一個新的軸域,但是這個軸域是ax2
僅帶有x
軸的『雙生子』。
這足以創(chuàng)建軸域了。我們叫它ax2v
,因為這個軸域是ax2
加交易量。
現(xiàn)在,我們在軸域上定義繪圖,我們將添加:
我們在 0 和當前交易量之間填充,給予它藍色的前景色,然后給予它一個透明度。 我們想要應(yīng)用幽冥毒,以防交易量最終覆蓋其它東西,所以我們?nèi)匀豢梢钥吹竭@兩個元素。
所以,到現(xiàn)在為止,我們的代碼為:
會生成:
太棒了,到目前為止還不錯。 接下來,我們可能要刪除新y
軸上的標簽,然后我們也可能不想讓交易量占用太多空間。 沒問題:
首先:
上面將y
刻度標簽設(shè)置為一個空列表,所以不會有任何標簽了。
譯者注:所以將標簽刪除之后,添加新軸的意義是什么?直接在原軸域上繪圖就可以了。
接下來,我們可能要將網(wǎng)格設(shè)置為false
,使軸域上不會有雙網(wǎng)格:
最后,為了處理交易量占用很多空間,我們可以做以下操作:
所以這設(shè)置y
軸顯示范圍從 0 到交易量的最大值的 3 倍。 這意味著,在最高點,交易量最多可占據(jù)圖形的33%。 所以,增加volume.max
的倍數(shù)越多,空間就越小/越少。
現(xiàn)在,我們的圖表為:
到這里,我們差不多完成了。 這里唯一的缺陷是一個好的圖例。 一些線條是顯而易見的,但人們可能會好奇移動均值的參數(shù)是什么,我們這里是 10 和 30。 添加自定義圖例是下一個教程中涉及的內(nèi)容。
在這篇 Matplotlib 教程中,我們將討論自定義圖例。 我們已經(jīng)介紹了添加圖例的基礎(chǔ)知識。
圖例的主要問題通常是圖例阻礙了數(shù)據(jù)的展示。 這里有幾個選項。 一個選項是將圖例放在軸域外,但是我們在這里有多個子圖,這是非常困難的。 相反,我們將使圖例稍微小一點,然后應(yīng)用一個透明度。
首先,為了創(chuàng)建一個圖例,我們需要向我們的數(shù)據(jù)添加我們想要顯示在圖例上的標簽。
請注意,我們通過創(chuàng)建空行為交易量添加了標簽。 請記住,我們不能對任何填充應(yīng)用標簽,所以這就是我們添加這個空行的原因。
現(xiàn)在,我們可以在右下角添加圖例,通過在plt.show()
之前執(zhí)行以下操作:
會生成:
所以,我們可以看到,圖例還是占用了一些位置。 讓我們更改位置,大小并添加透明度:
所有的圖例位于位置 9(上中間)。 有很多地方可放置圖例,我們可以為參數(shù)傳入不同的位置號碼,來看看它們都位于哪里。 ncol
參數(shù)允許我們指定圖例中的列數(shù)。 這里只有一列,如果圖例中有 2 個項目,他們將堆疊在一列中。 最后,我們將尺寸規(guī)定為更小。 之后,我們對整個圖例應(yīng)用0.4
的透明度。
現(xiàn)在我們的結(jié)果為:
完整的代碼為:
現(xiàn)在我們可以看到圖例,但也看到了圖例下的任何信息。 還要注意額外函數(shù)fig.savefig
。 這是自動保存圖形的圖像的方式。 我們還可以設(shè)置所保存的圖形的前景色,使背景不是白色的,如我們的例子所示。
這就是目前為止,我想要顯示的典型 Matplotlib 圖表。 接下來,我們將涉及Basemap
,它是一個 Matplotlib 擴展,用于繪制地理位置,然后我打算講解 Matplotlib 中的 3D 圖形。
在這個 Matplotlib 教程中,我們將涉及地理繪圖模塊Basemap
。 Basemap
是 Matplotlib 的擴展。
為了使用Basemap
,我們首先需要安裝它。 為了獲得Basemap
,你可以從這里獲?。?a target="_blank">http://matplotlib.org/basemap/users/download.html,或者你可以訪問http://www.lfd.uci.edu/~gohlke/pythonlibs/。
如果你在安裝Basemap
時遇到問題,請查看pip
安裝教程。
一旦你安裝了Basemap
,你就可以創(chuàng)建地圖了。 首先,讓我們投影一個簡單的地圖。 為此,我們需要導(dǎo)入Basemap
,pyplot
,創(chuàng)建投影,至少繪制某種輪廓或數(shù)據(jù),然后我們可以顯示圖形。
上面的代碼結(jié)果如下:
這是使用 Miller 投影完成的,這只是許多Basemap
投影選項之一。
在這篇 Matplotlib 教程中,我們繼續(xù)使用Basemap
地理繪圖擴展。 我們將展示一些我們可用的自定義選項。
首先,從上一個教程中獲取我們的起始代碼:
我們可以從放大到特定區(qū)域來開始:
這里的參數(shù)是:
llcrnrlat
- 左下角的緯度
llcrnrlon
- 左下角的經(jīng)度
urcrnrlat
- 右上角的緯度
urcrnrlon
- 右上角的經(jīng)度
此外,坐標需要轉(zhuǎn)換,其中西經(jīng)和南緯坐標是負值,北緯和東經(jīng)坐標是正值。
使用這些坐標,Basemap
會選擇它們之間的區(qū)域。
下面,我們要使用一些東西,類似:
這會畫出國家,并使用線寬為 2 的線條生成分界線。
另一個選項是:
這會用藍色線條畫出州。
你也可以執(zhí)行:
這會畫出國家。
所以,我們的代碼是:
很難說,但我們定義了美國的區(qū)縣的線條。 我們可以使用放大鏡放大Basemap
圖形,就像其他圖形那樣,會生成:
另一個有用的選項是Basemap
調(diào)用中的『分辨率』選項。
分辨率的選項為:
c
- 粗糙
l
- 低
h
- 高
f
- 完整
對于更高的分辨率,你應(yīng)該放大到很大,否則這可能只是浪費。
另一個選項是使用etopo()
繪制地形,如:
使用drawcountries
方法繪制此圖形會生成:
最后,有一個藍色的大理石版本,你可以調(diào)用:
會生成:
目前為止的代碼:
歡迎閱讀另一個 Matplotlib Basemap 教程。 在本教程中,我們將介紹如何繪制單個坐標,以及如何在地理區(qū)域中連接這些坐標。
首先,我們將從一些基本的起始數(shù)據(jù)開始:
接下來,我們可以繪制坐標,從獲得它們的實際坐標開始。 記住,南緯和西經(jīng)坐標需要轉(zhuǎn)換為負值。 例如,紐約市是北緯40.7127
西經(jīng)74.0059
。 我們可以在我們的程序中定義這些坐標,如:
之后我們將這些轉(zhuǎn)換為要繪制的x
和y
坐標。
注意這里,我們現(xiàn)在已經(jīng)將坐標順序翻轉(zhuǎn)為lon, lat
(緯度,經(jīng)度)。 坐標通常以lat, lon
順序給出。 然而,在圖形中,lat, long
轉(zhuǎn)換為y, x
,我們顯然不需要。 在某些時候,你必須翻轉(zhuǎn)它們。 不要忘記這部分!
最后,我們可以繪制如下的坐標:
這個圖表上有一個青色的星,大小為 15。更多標記類型請參閱:Matplotlib 標記文檔。
接下來,讓我們再畫一個位置,洛杉磯,加利福尼亞:
這次我們畫出一個綠色三角,執(zhí)行代碼會生成:
如果我們想連接這些圖塊怎么辦?原來,我們可以像其它 Matplotlib 圖表那樣實現(xiàn)它。
首先,我們將那些xpt
和ypt
坐標保存到列表,類似這樣的東西:
會生成:
太棒了。有時我們需要以圓弧連接圖上的兩個坐標。如何實現(xiàn)呢?
我們的完整代碼為:
結(jié)果為:
這就是Basemap
的全部了,下一章關(guān)于 Matplotlib 的 3D 繪圖。
您好,歡迎閱讀 Matplotlib 教程中的 3D 繪圖。 Matplotlib 已經(jīng)內(nèi)置了三維圖形,所以我們不需要再下載任何東西。 首先,我們需要引入一些完整的模塊:
使用axes3d
是因為它需要不同種類的軸域,以便在三維中實際繪制一些東西。 下面:
在這里,我們像通常一樣定義圖形,然后我們將ax1
定義為通常的子圖,只是這次使用 3D 投影。 我們需要這樣做,以便提醒 Matplotlib 我們要提供三維數(shù)據(jù)。
現(xiàn)在讓我們創(chuàng)建一些 3D 數(shù)據(jù):
接下來,我們繪制它。 首先,讓我們展示一個簡單的線框示例:
最后:
我們完整的代碼是:
結(jié)果為(包括所用的樣式):
這些 3D 圖形可以進行交互。 首先,您可以使用鼠標左鍵單擊并拖動來移動圖形。 您還可以使用鼠標右鍵單擊并拖動來放大或縮小。
歡迎閱讀另一個 3D Matplotlib 教程,會涉及如何繪制三維散點圖。
繪制 3D 散點圖非常類似于通常的散點圖以及 3D 線框圖。
一個簡單示例:
結(jié)果為:
要記住你可以修改這些繪圖的大小和標記,就像通常的散點圖那樣。
在這個 Matplotlib 教程中,我們要介紹 3D 條形圖。 3D 條形圖是非常獨特的,因為它允許我們繪制多于 3 個維度。 不,你不能超過第三個維度來繪制,但你可以繪制多于 3 個維度。
對于條形圖,你需要擁有條形的起點,條形的高度和寬度。 但對于 3D 條形圖,你還有另一個選項,就是條形的深度。 大多數(shù)情況下,條形圖從軸上的條形平面開始,但是你也可以通過打破此約束來添加另一個維度。 然而,我們會讓它非常簡單:
注意這里,我們必須定義x
、y
和z
,然后是 3 個維度的寬度、高度和深度。 這會生成:
歡迎閱讀最后的 Matplotlib 教程。 在這里我們將整理整個系列,并顯示一個稍微更復(fù)雜的 3D 線框圖:
如果你從一開始就關(guān)注這個教程的話,那么你已經(jīng)學會了 Matplotlib 提供的大部分內(nèi)容。 你可能不相信,但Matplotlib 仍然可以做很多其他的事情! 請繼續(xù)學習,你可以隨時訪問 Matplotlib.org,并查看示例和圖庫頁面。
如果你發(fā)現(xiàn)自己大量使用 Matplotlib,請考慮捐助給 John Hunter Memorial 基金。
注:空間曲面的畫法
聯(lián)系客服