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__dictpandas.DataFrameh5py、...)以使用字串鍵存取像 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

../../_images/sphx_glr_color_cycle_001.png

新的顏色映射#

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

原始碼2x.pngpng

樣式#

已新增數個新樣式,包括來自 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)#

已新增一些參數,其他參數則已改進。

參數

描述

xaxis.labelpadyaxis.labelpad

mplot3d 現在會遵循這些屬性,這些屬性預設為 rcParams["axes.labelpad"](預設值:4.0

rcParams["axes.labelpad"](預設值:4.0

軸與標籤之間的預設間距

rcParams["errorbar.capsize"](預設值:0.0

誤差線末端的預設長度

rcParams["xtick.minor.visible"](預設值:False)、rcParams["ytick.minor.visible"](預設值:False

次要 x/y 刻度的預設可見性

rcParams["legend.framealpha"](預設值:0.8

圖例框架方塊的預設透明度

rcParams["legend.facecolor"](預設值:'inherit'

圖例框架方塊的預設 facecolor(或從 rcParams["axes.facecolor"](預設值:'white')繼承)

rcParams["legend.edgecolor"](預設值:'0.8'

圖例框架方塊的預設 edgecolor(或從 rcParams["axes.edgecolor"](預設值:'black')繼承)

rcParams["figure.titlesize"](預設值:'large'

圖形子標題的預設字型大小

rcParams["figure.titleweight"](預設值:'normal'

圖形子標題的預設字型粗細

rcParams["image.composite_image"](預設值:True

向量圖形後端在儲存時是否應將多個影像合併成單一影像。當需要在 Inkscape 或其他程式中進一步編輯檔案時很有用。

rcParams["markers.fillstyle"](預設值:'full'

標記的預設填滿樣式。可能的值為 'full'(預設值)、'left''right''bottom''top''none'

rcParams["toolbar"](預設值:'toolbar2'

已新增 'toolmanager' 作為有效值,以啟用實驗性的 ToolManager 功能。

小工具#

選取器的作用中狀態#

所有選取器現在都實作了 set_activeget_active 方法(存取 active 屬性時也會呼叫)來正確更新和查詢它們是否處於作用中狀態。

ignoreset_activeget_active 方法移至基礎類別 Widget#

將子類別中的重複方法上移至父類別,以避免程式碼重複。

為 MultiCursor 新增啟用/停用功能#

MultiCursor 物件可以在建立後停用(和啟用),而無需銷毀物件。範例:

multi_cursor.active = False

改進 RectangleSelector 並新增 EllipseSelector Widget#

新增一個 interactive 關鍵字,可在繪製形狀後啟用可見的控制點來操作形狀。

為以下操作新增鍵盤修飾鍵:

  • 移動現有形狀(預設按鍵 = 'space')

  • 將形狀設為正方形(預設按鍵 = 'shift')

  • 將初始點設為形狀中心(預設按鍵 = 'control')

  • 可以組合正方形和中心化操作

允許 Artist 在游標中顯示像素資料#

為 Artist 新增 get_cursor_dataformat_cursor_data 方法,可用於將 zdata 新增至狀態列中的游標顯示。也為 Images 新增實作。

新的繪圖功能#

自動換行文字#

為 Text 新增關鍵字參數 "wrap",會在繪製時自動斷開長文字行。適用於任何旋轉文字、不同的對齊模式,以及標籤或標題文字。此斷行發生在 Figure 的邊緣,而不是 Axes 的邊緣。

(原始碼2x.pngpng)

等高線圖角落遮罩#

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

../../_images/sphx_glr_contour_corner_mask_001.png

大致統一 Line2DPatchCollection 的線條樣式#

已統一 Lines、Patches 和 Collections 的線條樣式處理。現在它們都支援使用短符號(例如 "--")以及完整名稱(例如 "dashed")定義線條樣式。此外,所有使用 Line2DPatchCollection 的方法都支援使用虛線模式 ((0., [3., 3.])) 定義。

圖例標記順序#

新增使用 markerfirst 關鍵字在圖例框中將標籤放置在標記之前的能力

支援 PolyCollection 和 stackplot 的圖例#

PolyCollection 新增 legend_handler,並為 stackplot() 新增 labels 參數。

在 mplot3d 箭頭圖中支援替代樞軸點#

quiver 新增 pivot 關鍵字參數,用於控制箭頭線旋轉的樞軸點。這也決定了箭頭頭部沿箭頭線的位置。

Logit 尺度#

新增對 'logit' 軸尺度的支援,這是一種非線性轉換

\[x -> \log10(x / (1-x))\]

適用於 0 到 1 之間(不包含 0 和 1)的資料。

為 fill_between 新增 step 關鍵字參數#

Axes.fill_between 新增 step 關鍵字參數,允許在使用 'step' 繪圖樣式繪製的線之間進行填充。step 的值與 Axes.stepwhere 關鍵字參數的值相符。關鍵字參數名稱的不對稱性並不理想,但 Axes.fill_between 已經有 where 關鍵字參數。

這對於繪製預先分組的直方圖特別有用。

正方形圖表#

在軸函式中實作正方形圖表功能作為一個新參數。當指定參數 'square' 時,會設定等比例縮放,並設定限制,使 xmax-xmin == ymax-ymin

(原始碼2x.pngpng)

更新 figimage 以接收可選的調整大小參數#

新增使用 plt.figimage(X, resize=True) 繪製簡單 2D 陣列的功能。這對於在沒有軸或影像周圍的空白空間的情況下繪製簡單 2D 陣列很有用。

(原始碼2x.pngpng)

更新 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 的支援,以僅繪製列或欄線圖。

(原始碼2x.pngpng)

繪製具有標籤的 bar 和 barh 圖表#

barbarh 中新增了 kwarg tick_label,以支援繪製每個長條帶有文字標籤的長條圖。

(原始碼, 2x.png, png)

在 pie 中新增了 center 和 frame kwargs#

這些控制圓餅圖的中心位置以及是否顯示 Axes 的框架。

修正了 3D 填充等高線圖的多邊形渲染#

某些情況下,產生具有多個孔洞的多邊形的 3D 填充等高線圖,由於 PolyCollectionPoly3DCollection 之間路徑資訊遺失,導致渲染不正確。新增了 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() 如預期般運作#

與新增至 Axes 的 Artist 一樣,可以透過 remove() 從其圖表中移除 Axes 物件。

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 會透過 DrawingAreaTextArea 繪製到 OffsetBox 型別的物件上。TextArea 會計算文字所需的空間,因此文字始終在邊界內,對於這一點沒有任何變更。

但是,DrawingArea 會充當零個或多個 Artist 的父項,這些 Artist 會在其上繪圖,並且可能超出邊界。現在,子 Artist 可以被剪裁到 DrawingArea 的邊界內。

tight_layout 現在會考慮 OffsetBoxes#

當呼叫 tight_layout()Figure.tight_layoutGridSpec.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 介面。但別擔心,預設的後端包含一個名為 toolbarToolContainerBase

注意

目前,我們發布此功能主要是為了收集回饋,在進一步通知之前,應將其視為實驗性質,因為 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 的工具,有兩個基本方法 enabledisable,它們會在切換時自動被呼叫。

完整的範例位於 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 參數控制,該參數目前支援 nonehtml5 的值。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 來設定它。如果您的工具鏈有前綴,這點很重要。這與在建置前設定 CCCXX 的方式類似。以下是一個範例:

export PKG_CONFIG=x86_64-pc-linux-gnu-pkg-config