Matplotlib 1.5 的新功能 (2015 年 10 月 29 日)#
注意
matplotlib 1.5 支援 Python 2.7、3.4 和 3.5
互動式 OO 用法#
現在所有 Artist
都會追蹤其內部狀態是否已變更但未反映在顯示中(「過時」),方法是呼叫 draw
。因此,可以實際確定是否需要在互動式會話中重新繪製給定的 Figure
。
為了方便互動式使用,已將 draw_all
方法新增至 pyplot
,這將重新繪製所有「過時」的圖形。
為了方便互動式使用,matplotlib 現在會向 IPython 的「post_execute」事件或標準 python REPL 中的 displayhook 註冊一個函數,以在控制權返回 REPL 之前自動呼叫 plt.draw_all
。這可確保延遲繪製命令,並且僅呼叫一次。
這樣做的結果是,對於互動式後端(包括 %matplotlib notebook
)在互動模式下(使用 plt.ion()
)
import matplotlib.pyplot as plt
fig, ax = plt.subplots()
ln, = ax.plot([0, 1, 4, 9, 16])
plt.show()
ln.set_color('g')
會自動更新繪圖以顯示為綠色。後續對 Artist
物件的任何修改也會如此。
這是 pyplot 內部更大範圍的整合和簡化的第一步。
使用如 pandas DataFrames 等標記數據#
將陣列作為輸入的繪圖方法現在也可以使用標記數據並解開這些數據。
這表示以下兩個範例會產生相同的繪圖
範例
df = pandas.DataFrame({"var1":[1,2,3,4,5,6], "var2":[1,2,3,4,5,6]})
plt.plot(df["var1"], df["var2"])
範例
plt.plot("var1", "var2", data=df)
這適用於大多數將陣列/序列作為輸入的繪圖方法。data
可以是任何支援 __getitem__
(dict
、pandas.DataFrame
、h5py
、...)以使用字串鍵存取像 array
的值的任何內容。
此外,還進行了一些其他變更,使處理標籤數據(例如 pandas.Series
)更加容易。
對於帶有
label
關鍵字引數的繪圖方法,其中一個數據輸入會被指定為標籤來源。如果使用者沒有提供label
,則會對該值物件進行內省以尋找標籤,目前是尋找name
屬性。如果該值物件沒有name
屬性,但已在data
關鍵字引數中指定為鍵值,則會使用該鍵值。在上述範例中,這會在兩種情況下產生隱含的label="var2"
。如果未提供
x
引數,plot()
現在會使用Series
的索引,而不是np.arange(len(y))
。
在 rcParams 中新增 axes.prop_cycle
鍵#
這是已棄用的 axes.color_cycle
參數的更通用形式。現在,我們不僅可以循環顏色,還可以循環線條樣式、陰影線和幾乎任何其他藝術家屬性。循環器符號用於定義屬性循環。將循環器加在一起就像是將兩個或多個屬性循環 zip
在一起。
axes.prop_cycle: cycler('color', 'rgb') + cycler('lw', [1, 2, 3])
您甚至可以將循環器相乘,這就像對兩個或多個屬性循環使用 itertools.product
。

新的顏色映射#
所有四個建議作為新預設的顏色映射都可作為 'viridis'
(2.0 中的新預設)、'magma'
、'plasma'
和 'inferno'
使用

樣式#
已新增數個新樣式,包括來自 Seaborn 專案的許多樣式。此外,為了準備即將推出的 2.0 樣式變更版本,已新增「classic」和「default」樣式。在此版本中,「default」和「classic」樣式是相同的。現在在您的腳本中使用它們,您可以協助確保在未來升級 matplotlib 時順利過渡,以便您在準備好時可以升級到時髦的新預設值!
import matplotlib.style
matplotlib.style.use('classic')
「default」樣式將為您提供 matplotlib 的最新繪圖樣式
matplotlib.style.use('default')
後端#
新的後端選擇#
現在可以使用環境變數 MPLBACKEND
來設定 matplotlib 後端。
wx 後端已更新#
wx 後端現在可以與 wxPython classic 和 Phoenix 一起使用。
wxPython classic 必須至少為 2.8.12 版,並且適用於 Python 2.x。截至 2015 年 5 月,沒有 wxPython Phoenix 的正式版本可用,但目前的快照將適用於 Python 2.7+ 和 3.4+。
如果您安裝了多個 wxPython 版本,則使用者程式碼負責設定 wxPython 版本。如何在 嵌入在 wx #2 範例開頭的註解中說明了如何執行此操作。
組態 (rcParams)#
已新增一些參數,其他參數則已改進。
參數 |
描述 |
---|---|
|
mplot3d 現在會遵循這些屬性,這些屬性預設為 |
|
軸與標籤之間的預設間距 |
|
誤差線末端的預設長度 |
|
次要 x/y 刻度的預設可見性 |
|
圖例框架方塊的預設透明度 |
|
圖例框架方塊的預設 facecolor(或從 |
|
圖例框架方塊的預設 edgecolor(或從 |
|
圖形子標題的預設字型大小 |
|
圖形子標題的預設字型粗細 |
|
向量圖形後端在儲存時是否應將多個影像合併成單一影像。當需要在 Inkscape 或其他程式中進一步編輯檔案時很有用。 |
|
標記的預設填滿樣式。可能的值為 |
|
已新增 |
小工具#
選取器的作用中狀態#
所有選取器現在都實作了 set_active
和 get_active
方法(存取 active
屬性時也會呼叫)來正確更新和查詢它們是否處於作用中狀態。
將 ignore
、set_active
和 get_active
方法移至基礎類別 Widget
#
將子類別中的重複方法上移至父類別,以避免程式碼重複。
為 MultiCursor 新增啟用/停用功能#
MultiCursor 物件可以在建立後停用(和啟用),而無需銷毀物件。範例:
multi_cursor.active = False
改進 RectangleSelector 並新增 EllipseSelector Widget#
新增一個 interactive 關鍵字,可在繪製形狀後啟用可見的控制點來操作形狀。
為以下操作新增鍵盤修飾鍵:
移動現有形狀(預設按鍵 = 'space')
將形狀設為正方形(預設按鍵 = 'shift')
將初始點設為形狀中心(預設按鍵 = 'control')
可以組合正方形和中心化操作
允許 Artist 在游標中顯示像素資料#
為 Artist 新增 get_cursor_data
和 format_cursor_data
方法,可用於將 zdata 新增至狀態列中的游標顯示。也為 Images 新增實作。
新的繪圖功能#
自動換行文字#
為 Text 新增關鍵字參數 "wrap",會在繪製時自動斷開長文字行。適用於任何旋轉文字、不同的對齊模式,以及標籤或標題文字。此斷行發生在 Figure
的邊緣,而不是 Axes
的邊緣。

等高線圖角落遮罩#
Ian Thomas 重寫了計算等高線的 C++ 程式碼,以新增對角落遮罩的支援。此功能由函式 contour()
和 contourf()
中的新關鍵字參數 corner_mask
控制。先前行為(現在使用 corner_mask=False
取得)是讓單個遮罩點完全遮蔽所有接觸該點的四邊形。新行為(使用 corner_mask=True
取得)只遮蔽接觸該點的四邊形的角落;任何由三個未遮罩點組成的三角形角落會照常繪製等高線。如果未指定 corner_mask
關鍵字參數,則會從 rcParams 取得預設值。

大致統一 Line2D
、Patch
和 Collection
的線條樣式#
已統一 Lines、Patches 和 Collections 的線條樣式處理。現在它們都支援使用短符號(例如 "--")以及完整名稱(例如 "dashed")定義線條樣式。此外,所有使用 Line2D
、Patch
或 Collection
的方法都支援使用虛線模式 ((0., [3., 3.])
) 定義。
圖例標記順序#
新增使用 markerfirst
關鍵字在圖例框中將標籤放置在標記之前的能力
支援 PolyCollection 和 stackplot 的圖例#
為 PolyCollection
新增 legend_handler
,並為 stackplot()
新增 labels 參數。
在 mplot3d 箭頭圖中支援替代樞軸點#
為 quiver
新增 pivot
關鍵字參數,用於控制箭頭線旋轉的樞軸點。這也決定了箭頭頭部沿箭頭線的位置。
Logit 尺度#
新增對 'logit' 軸尺度的支援,這是一種非線性轉換
適用於 0 到 1 之間(不包含 0 和 1)的資料。
為 fill_between 新增 step 關鍵字參數#
為 Axes.fill_between
新增 step
關鍵字參數,允許在使用 'step' 繪圖樣式繪製的線之間進行填充。step
的值與 Axes.step
的 where
關鍵字參數的值相符。關鍵字參數名稱的不對稱性並不理想,但 Axes.fill_between
已經有 where
關鍵字參數。
這對於繪製預先分組的直方圖特別有用。
正方形圖表#
在軸函式中實作正方形圖表功能作為一個新參數。當指定參數 'square' 時,會設定等比例縮放,並設定限制,使 xmax-xmin == ymax-ymin
。

更新 figimage 以接收可選的調整大小參數#
新增使用 plt.figimage(X, resize=True)
繪製簡單 2D 陣列的功能。這對於在沒有軸或影像周圍的空白空間的情況下繪製簡單 2D 陣列很有用。

更新 Figure.savefig() 現在可以使用圖形的 dpi#
新增使用 dpi='figure'
以與螢幕上的圖形相同的 dpi 儲存圖形的支援:
範例
f = plt.figure(dpi=25) # dpi set to 25
S = plt.scatter([1,2,3],[4,5,6])
f.savefig('output.png', dpi='figure') # output savefig dpi set to 25 (same as figure)
更新 Table 以控制邊緣可見性#
新增切換表格中線條可見性的功能。功能已新增至 pyplot.table
工廠函式,其關鍵字參數為 "edges"。值可以是字串 "open"、"closed"、"horizontal"、"vertical" 或字母 "L"、"R"、"T"、"B" 的組合,分別代表左、右、上和下。
範例
table(..., edges="open") # No line visible
table(..., edges="closed") # All lines visible
table(..., edges="horizontal") # Only top and bottom lines visible
table(..., edges="LT") # Only left and top lines visible.
在 plot_wireframe 中支援零 r/cstride#
Adam Hughes 新增對 mplot3d 的 plot_wireframe 的支援,以僅繪製列或欄線圖。

繪製具有標籤的 bar 和 barh 圖表#
在 bar
和 barh
中新增了 kwarg tick_label,以支援繪製每個長條帶有文字標籤的長條圖。

在 pie 中新增了 center 和 frame kwargs#
這些控制圓餅圖的中心位置以及是否顯示 Axes 的框架。
修正了 3D 填充等高線圖的多邊形渲染#
某些情況下,產生具有多個孔洞的多邊形的 3D 填充等高線圖,由於 PolyCollection
和 Poly3DCollection
之間路徑資訊遺失,導致渲染不正確。新增了 set_verts_and_codes()
函式,以保留路徑資訊以進行正確的渲染。
密集色彩條已柵格化#
向量檔案格式 (pdf、ps、svg) 對於許多類型的繪圖元素來說很有效率,但對於某些元素,它們可能會產生過大的檔案大小,甚至導致渲染偽影,這取決於螢幕顯示所使用的渲染器。對於顯示大量陰影的色彩條來說,這是一個問題,這也是最常見的情況。現在,如果色彩條顯示 50 種或更多顏色,它將在向量後端中進行柵格化。
DateFormatter strftime#
DateFormatter
的 __call__
方法將使用傳遞給格式化器的建構函式的格式字串來格式化 datetime.datetime
物件。此方法接受 1900 年之前的年份的日期時間,這與 datetime.datetime.strftime()
不同。
文字的 Artist 等級 {get,set}_usetex#
將 {get,set}_usetex
方法新增至 Text
物件,允許 Artist 等級控制 LaTeX 渲染與內部 mathtex 渲染。
Axes.remove()
如預期般運作#
Locators set_params() 函式中的 API 一致性修正#
set_params()
函式,它設定 Locator
型別實例中的參數,現在適用於所有 Locator
型別。該實作還透過嚴格定義使用者可以設定的參數來防止不安全的使用。
若要使用,請在 Locator
實例上呼叫 set_params()
,並加上所需的引數
loc = matplotlib.ticker.LogLocator()
# Set given attributes for loc.
loc.set_params(numticks=8, numdecs=8, subs=[2.0], base=8)
# The below will error, as there is no such parameter for LogLocator
# named foo
# loc.set_params(foo='bar')
日期定位器#
日期定位器 (衍生自 DateLocator
) 現在實作了 tick_values
方法。這是衍生自 Locator
的所有定位器所預期的。
現在可以輕鬆使用日期定位器,而無需建立軸
from datetime import datetime
from matplotlib.dates import YearLocator
t0 = datetime(2002, 10, 9, 12, 10)
tf = datetime(2005, 10, 9, 12, 15)
loc = YearLocator()
values = loc.tick_values(t0, tf)
OffsetBoxes 現在支援剪裁#
Artist
會透過 DrawingArea
和 TextArea
繪製到 OffsetBox
型別的物件上。TextArea
會計算文字所需的空間,因此文字始終在邊界內,對於這一點沒有任何變更。
但是,DrawingArea
會充當零個或多個 Artist
的父項,這些 Artist
會在其上繪圖,並且可能超出邊界。現在,子 Artist
可以被剪裁到 DrawingArea
的邊界內。
tight_layout 現在會考慮 OffsetBoxes#
當呼叫 tight_layout()
或 Figure.tight_layout
或 GridSpec.tight_layout()
時,錨定在軸外的 OffsetBox
不會被截斷。在有多個子圖的情況下,OffsetBox
也將不會被其他軸重疊。
多頁 PDF 中的每頁 PDF 註解 (PdfPages)#
將新的方法 attach_note()
新增至 PdfPages 類別,允許將簡單的文字註解附加到多頁圖表的 PDF 中的頁面。新的註解在具有此功能的檢視器 (Adobe Reader、OSX Preview、Skim 等) 中的 PDF 註解清單中可見。預設情況下,註解本身會保留在頁面外,以防止它出現在列印輸出中。
PdfPages.attach_note
需要在 savefig
之前呼叫,以便新增到正確的圖表中。
更新了 fignum_exists 以接受圖表名稱#
新增了使用圖表名稱而非僅使用圖表編號來檢查圖表存在的能力。範例
figure('figure')
fignum_exists('figure') #true
ToolManager#
Federico Ariza 撰寫了新的 ToolManager
,它會取代 NavigationToolbar2
ToolManager
提供了一種新的方式來檢視使用者與圖表的互動。在之前,我們有 NavigationToolbar2
,它有自己的工具,例如 zoom/pan/home/save/...
,同時我們也有快捷鍵,例如 yscale/grid/quit/....
。ToolManager
將所有這些操作重新定位為工具(位於 backend_tools
中),並定義了一種存取/觸發/重新配置它們的方式。
工具列被 ToolContainerBase
取代,它們只是觸發工具的 GUI 介面。但別擔心,預設的後端包含一個名為 toolbar
的 ToolContainerBase
。
注意
目前,我們發布此功能主要是為了收集回饋,在進一步通知之前,應將其視為實驗性質,因為 API 變更將會發生。目前,ToolManager
僅適用於 GTK3 和 Tk 後端。請確保您使用其中之一。其餘後端的移植即將推出。
要啟用 ToolManager
,請在您的檔案頂部加入以下內容:
>>> matplotlib.rcParams['toolbar'] = 'toolmanager'
與 ToolContainer 互動#
最重要的功能是能夠輕鬆地重新配置 ToolContainer(又稱工具列)。例如,如果我們要移除「forward」按鈕,我們只需要執行。
>>> fig.canvas.manager.toolmanager.remove_tool('forward')
現在,如果您想以程式方式觸發「home」按鈕:
>>> fig.canvas.manager.toolmanager.trigger_tool('home')
ToolManager 的新工具#
可以將新的工具添加到 ToolManager。
一個非常簡單的工具,會印出「You're awesome」如下:
from matplotlib.backend_tools import ToolBase
class AwesomeTool(ToolBase):
def trigger(self, *args, **kwargs):
print("You're awesome")
將此工具添加到 ToolManager
:
>>> fig.canvas.manager.toolmanager.add_tool('Awesome', AwesomeTool)
如果我們要為該工具新增快捷鍵(「d」):
>>> fig.canvas.manager.toolmanager.update_keymap('Awesome', 'd')
將其添加到 'foo' 群組中的工具列:
>>> fig.canvas.manager.toolbar.add_tool('Awesome', 'foo')
還有第二種工具,「可切換工具」,它們與我們的基本工具幾乎相同,只是屬於一個群組,並且在該群組內是互斥的。對於衍生自 ToolToggleBase
的工具,有兩個基本方法 enable
和 disable
,它們會在切換時自動被呼叫。
完整的範例位於 Tool Manager。
cbook.is_sequence_of_strings 識別字串物件#
這主要是 pandas 如何儲存字串序列的方式
import pandas as pd
import matplotlib.cbook as cbook
a = np.array(['a', 'b', 'c'])
print(cbook.is_sequence_of_strings(a)) # True
a = np.array(['a', 'b', 'c'], dtype=object)
print(cbook.is_sequence_of_strings(a)) # True
s = pd.Series(['a', 'b', 'c'])
print(cbook.is_sequence_of_strings(s)) # True
先前,最後兩個印出結果會傳回 false。
plot 指令的新 close-figs
參數#
Matplotlib 有一個 sphinx 擴展 plot_directive
,它可以建立用於包含在 sphinx 文件中的圖表。Matplotlib 1.5 為 plot 指令新增了一個新的選項 - close-figs
- 它會在建立圖表之前關閉任何先前的圖表視窗。這可以幫助避免在使用 plot_directive
時出現一些令人意外的重複圖表。
支援 URL 字串參數到 imread
#
imread()
函數現在接受指向遠端 PNG 檔案的 URL 字串。這會規避直接產生 HTTPResponse 物件。
IPython notebook 中動畫的顯示掛鉤#
Animation
實例獲得了一個 _repr_html_
方法,以支援在 notebook 中內嵌顯示動畫。用於顯示的方法由 animation.html
rc 參數控制,該參數目前支援 none
和 html5
的值。none
是預設值,不執行顯示。html5
將動畫轉換為 h264 編碼的影片,並直接嵌入 notebook 中。
不希望使用 _repr_html_
顯示掛鉤的使用者也可以手動呼叫 to_html5_video
方法來取得 HTML,並使用 IPython 的 HTML
顯示類別來顯示。
from IPython.display import HTML
HTML(anim.to_html5_video())
用於建置的具前綴 pkg-config#
pkg-config 的處理已修復,現在可以使用環境變數 PKG_CONFIG
來設定它。如果您的工具鏈有前綴,這點很重要。這與在建置前設定 CC
或 CXX
的方式類似。以下是一個範例:
export PKG_CONFIG=x86_64-pc-linux-gnu-pkg-config