Matplotlib 2.1.0 (2017 年 10 月 7 日) 的新功能#

文件#

範例已遷移為使用 sphinx gallery。這讓範例中能更好地混合散文和程式碼,提供連結以下載範例,包含 Python 腳本和 Jupyter Notebook,並改進縮圖庫。這些範例已重新組織為教學範例

許多文件字串和範例都已釐清和改進。

新功能#

字串類別值#

所有繪圖函數現在都支援字串類別值作為輸入。例如:

data = {'apples': 10, 'oranges': 15, 'lemons': 5, 'limes': 20}
fig, ax = plt.subplots()
ax.bar(data.keys(), data.values(), color='lightgray')

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

用於動畫的互動式 JS 小工具#

Jake Vanderplas 的 JSAnimation 套件已合併到 Matplotlib 中。這在 Matplotlib 中增加了 HTMLWriter 類別,用於生成 JavaScript HTML 動畫,適用於 IPython Notebook。這可以透過將 animation.html rc 參數設定為 jshtml 來預設啟用。也可以呼叫 to_jshtml 方法來手動轉換動畫。這可以使用 IPython 的 HTML 顯示類別來顯示

from IPython.display import HTML
HTML(animation.to_jshtml())

也可以透過請求 html 寫入器,使用 HTMLWriter 類別來生成 HTML 檔案。

極座標圖的增強功能#

極座標軸的轉換已大幅重構,以允許更多自訂的視圖限制和刻度標籤。視圖限制的其他選項允許建立環形、扇形或兩者的組合。

可以使用 set_rorigin() 方法來提供最小繪圖半徑的偏移量,從而產生環形。

set_theta_zero_location() 方法現在有一個可選的 offset 引數。此引數可用於根據給定的錨點進一步指定零點位置。

../../_images/sphx_glr_polar_scatter_002.png

極座標偏移量示範#

可以使用 set_thetamin()set_thetamax() 方法來限制繪製的角度範圍,產生圓形的扇形區域。

../../_images/sphx_glr_polar_scatter_003.png

極座標扇形演示#

先前的版本允許繪製包含負半徑的圖形,其中負值僅用作標籤,而實際半徑會根據設定的最小值進行偏移。此版本也允許負半徑用於網格和刻度,這些在以前會被靜默忽略。

徑向刻度已修改為與圓形網格線平行,而角度刻度已修改為與網格線平行。旋轉刻度標籤以匹配邊界也可能很有用。呼叫 ax.tick_params(rotation='auto') 將啟用新的行為:徑向刻度標籤將與圓形網格線平行,而角度刻度標籤將與網格線垂直(即與外邊界平行)。此外,刻度標籤現在會遵循之前僅在笛卡爾坐標圖上起作用的邊距設定。因此,不再應用 PolarAxes.set_thetagridsfrac 引數。刻度邊距可以使用 Axes.tick_paramsAxis.set_tick_paramspad 引數來修改。

Figure 類別現在具有 subplots 方法#

Figure 類別現在有一個 subplots() 方法,其行為與 pyplot.subplots() 相同,但在現有的圖形上執行。

Metadata savefig 關鍵字引數#

savefig() 現在接受 metadata 作為關鍵字引數。它可用於在圖片的 metadata 中儲存鍵/值對。

  • 'png' 搭配 Agg 後端

  • 'pdf' 搭配 PDF 後端(請參閱 writeInfoDict() 以取得支援的關鍵字清單)

  • 'eps' 和 'ps' 搭配 PS 後端(僅接受 'Creator' 鍵)

plt.savefig('test.png', metadata={'Software': 'My awesome software'})

忙碌游標#

當 Matplotlib 渲染畫布時,互動式 GUI 後端現在會將游標更改為忙碌狀態。

PolygonSelector#

PolygonSelector 類別已新增至 matplotlib.widgets。有關詳細資訊,請參閱 使用多邊形選擇器從集合中選擇索引

新增 matplotlib.ticker.PercentFormatter#

新的 PercentFormatter 格式化器具有一些不錯的功能,例如能夠將任意資料尺度轉換為百分比、可自訂的百分比符號以及對小數點的自動或手動控制。

可重製的 PS、PDF 和 SVG 輸出#

現在可以使用 SOURCE_DATE_EPOCH 環境變數來設定 PS 和 PDF 輸出中的時間戳記值。請參閱 來源日期紀元

或者,使用 metadata={'CreationDate': None} 呼叫 savefig 將完全省略 PDF 後端的時間戳記。

PS 和 PDF 後端的輸出的可重製性至今已使用各種繪圖元素進行測試,但僅使用諸如 {ps,pdf}.fonttype 之類選項的預設值,這些選項可能會在低層次影響輸出,而不是使用 mathtext 或 usetex 功能。當 Matplotlib 呼叫外部工具(例如 PS 蒸餾器或 LaTeX)時,它們的版本需要保持不變以確保可重製性,並且它們可能會在 Matplotlib 控制範圍之外新增不確定性的來源。

對於 SVG 輸出,較早的版本已新增 svg.hashsalt rc 參數。此參數會將 SVG 檔案中的一些隨機識別碼變更為確定性的。此設定的缺點是,如果使用確定性識別碼產生多個檔案,並且它們最終成為一個較大文件的一部分,則這些識別碼可能會衝突並導致不同部分相互影響。

這些功能現在已在 PDF 和 SVG 後端的測試中啟用,因此大多數測試輸出檔案(但並非全部)現在都是確定性的。

mplot3d 的正射投影#

Axes3D 現在接受 proj_type 關鍵字引數,並具有方法 set_proj_type()。預設選項與之前一樣為 'persp',而提供 'ortho' 則會啟用正射視圖。

比較 z 軸,它在正射視圖中是垂直的,但在透視圖中略微傾斜。

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

fig = plt.figure(figsize=(4, 6))
ax1 = fig.add_subplot(2, 1, 1, projection='3d')
ax1.set_proj_type('persp')
ax1.set_title('Perspective (default)')

ax2 = fig.add_subplot(2, 1, 2, projection='3d')
ax2.set_proj_type('ortho')
ax2.set_title('Orthographic')

plt.show()

原始碼2x.pngpng

mplot3d 的 voxels 函數#

Axes3D 現在有一個 voxels 方法,用於視覺化布林 3D 資料。用途可能包括繪製稀疏 3D 熱圖或視覺化體積模型。

../../_images/sphx_glr_voxels_numpy_logo_001.png

體素演示#

改進#

CheckButtons 小工具的 get_status 函數#

已將 get_status() 方法新增至 matplotlib.widgets.CheckButtons 類別。此 get_status 方法允許使用者查詢 CheckButtons 物件中所有按鈕的狀態 (True/False)。

fill_bar 引數新增至 AnchoredSizeBar#

現在,mpl_toolkits 類別的 AnchoredSizeBar 多了一個 fill_bar 參數,它可以讓尺寸標示條顯示為實心矩形,而不是只繪製矩形邊框。預設值為 None,是否預設填滿標示條取決於 size_vertical 的值。如果 size_vertical 不為零,fill_bar 會設定為 True。如果 size_vertical 為零,則 fill_bar 會設定為 False。如果您想要覆寫這個預設行為,請將 fill_bar 設定為 TrueFalse,以便無條件地始終或永不使用填滿的圖塊矩形來顯示尺寸標示條。

import matplotlib.pyplot as plt
from mpl_toolkits.axes_grid1.anchored_artists import AnchoredSizeBar

fig, ax = plt.subplots(figsize=(3, 3))

bar0 = AnchoredSizeBar(ax.transData, 0.3, 'unfilled', loc='lower left',
                       frameon=False, size_vertical=0.05, fill_bar=False)
ax.add_artist(bar0)
bar1 = AnchoredSizeBar(ax.transData, 0.3, 'filled', loc='lower right',
                       frameon=False, size_vertical=0.05, fill_bar=True)
ax.add_artist(bar1)

plt.show()

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

註解可以使用預設箭頭樣式#

現在,當設定 arrowprops={} 時,註解會使用預設的箭頭樣式,而不是沒有箭頭(新的行為實際上符合文件)。

風羽圖和箭頭圖支援日期#

當使用 quiver()barbs() 繪圖方法時,現在可以傳遞日期,就像其他方法(例如 plot())一樣。這也允許這些函式處理需要套用單位轉換的值。

六邊形圖的預設線條顏色#

hexbin() 的預設 linecolor 關鍵字引數現在為 'face',並且提供 'none' 現在可以防止在六邊形周圍繪製線條。

可以不帶引數呼叫 Figure.legend()#

現在可以不帶引數呼叫 Figure.legend()。在這種情況下,將建立一個圖例,其中包含圖形中所有軸上的所有繪圖元素。

圖例項目的多個圖例鍵#

一個圖例項目現在可以包含多個圖例鍵。擴充的 HandlerTuple 類別現在接受兩個參數:ndivide 將圖例區域分割為指定數量的區段;pad 會變更圖例鍵之間的間距。

../../_images/sphx_glr_legend_demo_004.png

多個圖例鍵#

figure() 的新參數 *clear*#

當使用 num 參數呼叫 pyplot 的函式 figure() 時,只有在沒有相同值的現有視窗時才會建立新的視窗。新增了一個新的布林參數 *clear* 用於明確清除其現有內容。當在互動式工作階段中使用時,這特別有用。由於 subplots() 也接受來自 figure() 的關鍵字引數,因此也可以在那裡使用

import matplotlib.pyplot as plt

fig0 = plt.figure(num=1)
fig0.suptitle("A fancy plot")
print("fig0.texts: ", [t.get_text() for t in fig0.texts])

fig1 = plt.figure(num=1, clear=False)  # do not clear contents of window
fig1.text(0.5, 0.5, "Really fancy!")
print("fig0 is fig1: ",  fig0 is fig1)
print("fig1.texts: ", [t.get_text() for t in fig1.texts])

fig2, ax2 = plt.subplots(2, 1, num=1, clear=True)  # clear contents
print("fig0 is fig2: ",  fig0 is fig2)
print("fig2.texts: ", [t.get_text() for t in fig2.texts])

# The output:
# fig0.texts:  ['A fancy plot']
# fig0 is fig1:  True
# fig1.texts:  ['A fancy plot', 'Really fancy!']
# fig0 is fig2:  True
# fig2.texts:  []

指定格式化為 LogFormatterMathtext 的純量最小值#

LogFormatterMathtext 現在包含一個選項,可指定格式化為純量的最小值指數(即 0.001 而不是 10-3)。

新的 quiverkey angle 關鍵字引數#

現在,繪製 quiverkey() 接受 angle 關鍵字引數,該引數設定繪製鍵箭頭的角度。

色譜反轉方法#

方法 matplotlib.colors.LinearSegmentedColormap.reversed()matplotlib.colors.ListedColormap.reversed() 會傳回 Colormap 的反轉執行個體。這會實作反轉任何 Colormap 的方法。

artist.setp (和 pyplot.setp)接受 *file* 引數#

該引數僅為關鍵字引數。它允許指定 sys.stdout 以外的輸出檔案。它的運作方式與 print 的 *file* 引數完全相同。

streamplot 的流線產生更具可設定性#

現在可以設定流線的起點、方向和長度。這允許追蹤向量場更長的時間,並且可以在某些使用案例中增強流動模式的可見度。

Axis.set_tick_params 現在會回應 *rotation*#

現在可以透過使用 *rotation* 關鍵字的 tick_params() 大量設定刻度標籤旋轉。

ax.tick_params(which='both', rotation=90)

刻度標籤會關閉而不是變成隱藏#

在內部,Tickmatplotlib.axis.Tick.label1On 屬性現在用於隱藏刻度標籤,而不是設定刻度標籤物件的可見度。這會提高整體效能並修正一些問題。因此,如果應顯示這些標籤,則需要使用 tick_params(),例如

ax.tick_params(labelbottom=True)

3D 長條圖中的陰影#

新的 shade 參數已新增到 3D bar 繪圖方法。預設行為仍然是為長條圖加上陰影,但現在使用者可以選擇將 shade 設定為 False

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

x = np.arange(2)
y = np.arange(3)
x2d, y2d = np.meshgrid(x, y)
x, y = x2d.ravel(), y2d.ravel()
z = np.zeros_like(x)
dz = x + y

fig = plt.figure(figsize=(4, 6))
ax1 = fig.add_subplot(2, 1, 1, projection='3d')
ax1.bar3d(x, y, z, 1, 1, dz, shade=True)
ax1.set_title('Shading On')

ax2 = fig.add_subplot(2, 1, 2, projection='3d')
ax2.bar3d(x, y, z, 1, 1, dz, shade=False)
ax2.set_title('Shading Off')

plt.show()

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

autofmt_xdate 新增 which 參數#

方法 autofmt_xdate() 現在具有 which 參數。這允許使用者選擇性地格式化 majorminorboth 刻度標籤。預設行為將旋轉並對齊 major 刻度標籤。

fig.autofmt_xdate(bottom=0.2, rotation=30, ha='right', which='minor')

subplot2grid 新增 Figure 參數#

函式 subplot2grid() 現在具有 fig 參數。這允許使用者指定將建立子圖的圖形。如果 figNone (預設值),則該方法將使用由 gcf() 檢索的目前圖形。

subplot2grid(shape, loc, rowspan=1, colspan=1, fig=myfig)

fill_betweenx 中的內插#

方法 fill_betweenx() 現在具有 interpolate 參數。這允許使用者內插資料並在交叉點填充區域,與 fill_between() 類似。

EngFormatter 的新關鍵字引數 sep#

已將新的 sep 關鍵字引數新增至 EngFormatter,並提供一種方法來定義將在值及其單位之間使用的字串。預設字串為 " ",這保留了先前的行為。此外,即使在沒有 SI 字首的情況下,分隔符號現在也出現在值及其單位之間。先前有一個錯誤導致傳回像 "3.14V" 這樣的字串,而不是預期的 "3.14 V" (使用預設行為)。

擴展 MATPLOTLIBRC 行為#

環境變數現在可以指定完整檔案路徑或包含 matplotlibrc 檔案的目錄路徑。

hist 的 density kwarg#

現在 hist() 方法優先使用 density 而不是 normed 來控制是否應該將直方圖正規化,這遵循 NumPy 的上游變更。這將減少混淆,因為其行為一直是直方圖的積分為 1 (而不是總和或最大值)。

內部#

新的 TransformedPatchPath 快取物件#

新加入的 TransformedPatchPath 提供一種方法,透過 TransformPatch 轉換為 Path,同時快取產生的路徑。如果 patch 或 transform 都沒有變更,則會傳回路徑的快取副本。

此類別與舊的 TransformedPath 的不同之處在於,它能夠根據基礎 patch 更新本身,而舊類別則使用不可變的路徑。

電影寫入器的抽象基礎類別#

新的 AbstractMovieWriter 類別定義了要用作 matplotlib.animation.Animation.save() 方法中 writer 的類別所需的 API。現有的 MovieWriter 類別現在衍生自新的抽象基礎類別。

更嚴格的線條樣式 rcParams 驗證#

與線條樣式相關的 rcParams 驗證 (lines.linestyleboxplot.*.linestylegrid.linestylecontour.negative_linestyle) 現在會有效地檢查值是否為有效的線條樣式。接受像 'dashed''--' 這樣的字串,以及像 [1, 1.65] 這樣的偶數長度的開關墨水序列。在後一種情況下,偏移值會在內部處理,不應由使用者提供。

新的驗證方案取代了先前用於 contour.negative_linestyle rcParams 的方案,該方案僅限於 'solid''dashed' 線條樣式。

驗證不區分大小寫。以下現在有效

grid.linestyle             : (1, 3)   # loosely dotted grid lines
contour.negative_linestyle : dashdot  # previously only solid or dashed

pytest#

自動測試已從 nose 切換到 pytest

效能#

路徑簡化更新#

path.simplifypath.simplify_threshold 參數控制的線條簡化已獲得改進。當繪製大量資料時,您應該會注意到更好的呈現效能 (只要上述參數設定正確)。只有路徑的線段部分會被簡化,如果您也在繪製標記且遇到呈現速度的問題,則應考慮使用 plotmarkevery 選項。如需更多資訊,請參閱使用教學中的 效能 章節。

簡化的工作方式是反覆地將線段合併為單一向量,直到下一個線段與向量的垂直距離 (以顯示座標空間測量) 大於 path.simplify_threshold 參數。因此,較高的 path.simplify_threshold 值會導致更快的呈現時間。如果您僅繪製以探索資料,而不是為了發佈品質的像素完美繪圖,則可以安全地使用 1.0 的值。如果您想確保您的繪圖完全反映您的資料,則應將 path.simplify 設定為 false 和/或將 path.simplify_threshold 設定為 0。Matplotlib 目前預設為保守值 1/9,較小的值不太可能導致繪圖中出現任何可見的差異。

在 c++ 中實作 intersects_bbox#

intersects_bbox() 已在 c++ 中實作,這提高了自動放置圖例的效能。