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')

用於動畫的互動式 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
引數。此引數可用於根據給定的錨點進一步指定零點位置。

極座標偏移量示範#
可以使用 set_thetamin()
和 set_thetamax()
方法來限制繪製的角度範圍,產生圓形的扇形區域。

極座標扇形演示#
先前的版本允許繪製包含負半徑的圖形,其中負值僅用作標籤,而實際半徑會根據設定的最小值進行偏移。此版本也允許負半徑用於網格和刻度,這些在以前會被靜默忽略。
徑向刻度已修改為與圓形網格線平行,而角度刻度已修改為與網格線平行。旋轉刻度標籤以匹配邊界也可能很有用。呼叫 ax.tick_params(rotation='auto')
將啟用新的行為:徑向刻度標籤將與圓形網格線平行,而角度刻度標籤將與網格線垂直(即與外邊界平行)。此外,刻度標籤現在會遵循之前僅在笛卡爾坐標圖上起作用的邊距設定。因此,不再應用 PolarAxes.set_thetagrids
的 frac
引數。刻度邊距可以使用 Axes.tick_params
或 Axis.set_tick_params
的 pad
引數來修改。
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()

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

體素演示#
改進#
將 fill_bar
引數新增至 AnchoredSizeBar
#
現在,mpl_toolkits
類別的 AnchoredSizeBar
多了一個 fill_bar
參數,它可以讓尺寸標示條顯示為實心矩形,而不是只繪製矩形邊框。預設值為 None
,是否預設填滿標示條取決於 size_vertical
的值。如果 size_vertical
不為零,fill_bar
會設定為 True
。如果 size_vertical
為零,則 fill_bar
會設定為 False
。如果您想要覆寫這個預設行為,請將 fill_bar
設定為 True
或 False
,以便無條件地始終或永不使用填滿的圖塊矩形來顯示尺寸標示條。
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()

註解可以使用預設箭頭樣式#
現在,當設定 arrowprops={}
時,註解會使用預設的箭頭樣式,而不是沒有箭頭(新的行為實際上符合文件)。
風羽圖和箭頭圖支援日期#
當使用 quiver()
和 barbs()
繪圖方法時,現在可以傳遞日期,就像其他方法(例如 plot()
)一樣。這也允許這些函式處理需要套用單位轉換的值。
六邊形圖的預設線條顏色#
hexbin()
的預設 linecolor
關鍵字引數現在為 'face'
,並且提供 'none'
現在可以防止在六邊形周圍繪製線條。
可以不帶引數呼叫 Figure.legend()#
現在可以不帶引數呼叫 Figure.legend()
。在這種情況下,將建立一個圖例,其中包含圖形中所有軸上的所有繪圖元素。
圖例項目的多個圖例鍵#
一個圖例項目現在可以包含多個圖例鍵。擴充的 HandlerTuple
類別現在接受兩個參數:ndivide
將圖例區域分割為指定數量的區段;pad
會變更圖例鍵之間的間距。

多個圖例鍵#
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)
刻度標籤會關閉而不是變成隱藏#
在內部,Tick
的 matplotlib.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()

為 autofmt_xdate
新增 which
參數#
方法 autofmt_xdate()
現在具有 which
參數。這允許使用者選擇性地格式化 major
、 minor
或 both
刻度標籤。預設行為將旋轉並對齊 major
刻度標籤。
fig.autofmt_xdate(bottom=0.2, rotation=30, ha='right', which='minor')
為 subplot2grid
新增 Figure 參數#
函式 subplot2grid()
現在具有 fig
參數。這允許使用者指定將建立子圖的圖形。如果 fig
為 None
(預設值),則該方法將使用由 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
提供一種方法,透過 Transform
將 Patch
轉換為 Path
,同時快取產生的路徑。如果 patch 或 transform 都沒有變更,則會傳回路徑的快取副本。
此類別與舊的 TransformedPath
的不同之處在於,它能夠根據基礎 patch 更新本身,而舊類別則使用不可變的路徑。
電影寫入器的抽象基礎類別#
新的 AbstractMovieWriter
類別定義了要用作 matplotlib.animation.Animation.save()
方法中 writer
的類別所需的 API。現有的 MovieWriter
類別現在衍生自新的抽象基礎類別。
更嚴格的線條樣式 rcParams 驗證#
與線條樣式相關的 rcParams 驗證 (lines.linestyle
、boxplot.*.linestyle
、grid.linestyle
和 contour.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#
效能#
路徑簡化更新#
由 path.simplify
和 path.simplify_threshold
參數控制的線條簡化已獲得改進。當繪製大量資料時,您應該會注意到更好的呈現效能 (只要上述參數設定正確)。只有路徑的線段部分會被簡化,如果您也在繪製標記且遇到呈現速度的問題,則應考慮使用 plot
的 markevery
選項。如需更多資訊,請參閱使用教學中的 效能 章節。
簡化的工作方式是反覆地將線段合併為單一向量,直到下一個線段與向量的垂直距離 (以顯示座標空間測量) 大於 path.simplify_threshold
參數。因此,較高的 path.simplify_threshold
值會導致更快的呈現時間。如果您僅繪製以探索資料,而不是為了發佈品質的像素完美繪圖,則可以安全地使用 1.0
的值。如果您想確保您的繪圖完全反映您的資料,則應將 path.simplify
設定為 false 和/或將 path.simplify_threshold
設定為 0
。Matplotlib 目前預設為保守值 1/9
,較小的值不太可能導致繪圖中出現任何可見的差異。
在 c++ 中實作 intersects_bbox#
intersects_bbox()
已在 c++ 中實作,這提高了自動放置圖例的效能。