Matplotlib 2.2 新功能 (2018 年 3 月 6 日)#

約束佈局管理器#

警告

約束佈局是實驗性的。其行為和 API 可能會變更,或者整個功能可能會在沒有棄用期的情況下移除。

新增了一種自動決定子圖及其組織 GridSpec 實例之間間距的新方法。它旨在取代舊有的 tight_layout 方法。它是透過新的 constrained_layout=True kwarg 呼叫,用於 Figuresubplots

此套件有新的 rcParams,並且可以使用新的 set_constrained_layout_pads 更精細地調整間距。

功能包括

  • 子圖的自動間距,子圖周圍和所有裝飾器都有固定的英吋大小的邊距,以及子圖之間間距為子圖大小的分數。

  • suptitle 和附加到多個軸的顏色條間距。

  • 使用 GridSpecFromSubplotSpec 的巢狀 GridSpec 佈局。

如需更多詳細資訊和功能,請參閱新的教學課程:約束佈局指南

請注意存取此項的新 API

新的 plt.figureplt.subplots kwarg:constrained_layout#

現在可以使用 constrained_layout=True kwarg 呼叫 figure()subplots(),以啟用 constrained_layout。

新的 ax.set_position 行為#

現在,Axes.set_position 會使指定的軸不再回應 constrained_layout,這與使用者想要手動放置軸的想法一致。

在內部,這表示舊的 ax.set_position 程式庫內的呼叫已變更為私有的 ax._set_position 呼叫,以便 constrained_layout 仍然適用於這些軸。

GridSpec 的新 figure kwarg#

為了方便使用 constrained_layoutGridSpec 現在接受一個 figure 關鍵字。這是向後相容的,不提供此關鍵字只會導致 constrained_layout 不會對此 GridSpec 實例所組織的子圖進行操作。使用 GridSpec 的常式 (例如 fig.subplots) 已被修改為將 figure 傳遞給 GridSpec

x 軸標籤和 y 軸標籤現在可以自動對齊#

如果刻度標籤的寬度差異很大,子圖的 ylabels 可能會在水平方向上錯位。如果刻度標籤在一個子圖上旋轉(例如),xlabels 也會發生同樣的情況。Figure 類別上的新方法:Figure.align_xlabelsFigure.align_ylabels 現在將水平或垂直對齊這些標籤。如果使用者只想對齊某些軸,則可以傳遞軸列表。如果未傳遞列表,則該演算法會查看圖形上的所有標籤。

只有具有相同子圖位置的標籤才會對齊。也就是說,只有當子圖位於子圖佈局的同一列時,才會對齊 y 軸標籤。

在呼叫這些方法之後,對齊是持續且自動的。

便利的包裝函式 Figure.align_labels 會同時呼叫這兩個函式。

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

軸圖例現在包含在 tight_bbox 中#

透過 ax.legend 建立的圖例有時可能會超出軸的限制。諸如 fig.tight_layout()fig.savefig(bbox_inches='tight') 等工具會剪裁這些圖例。已進行更改以將它們包含在 tight 計算中。

Cividis 色彩對應表#

新增了一個名為 'cividis' 的新深藍色/黃色色彩對應表。與 viridis 一樣,cividis 在感知上是均勻的,並且對色盲人士是友善的。但是,cividis 更進一步:它不僅可以讓色盲使用者使用,而且實際上對於色盲和非色盲使用者來說看起來應該完全相同。有關更多詳細資訊,請參閱 Nuñez J, Anderton C, and Renslow R: "Optimizing colormaps with consideration for color vision deficiency to enable accurate interpretation of scientific data"

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

新的色盲友善色彩循環樣式#

已新增一個新的色彩循環樣式定義 tableau-colorblind10,以提供另一個色盲友善圖表的選項。可以在樣式表的參考中找到此新樣式的示範。若要載入此色彩循環以取代預設的色彩循環

import matplotlib.pyplot as plt
plt.style.use('tableau-colorblind10')

支援 numpy.datetime64#

Matplotlib 長期以來在 matplotlib.dates 中支援 datetime.datetime 日期。我們現在也支援 numpy.datetime64 日期。任何可以使用 datetime.datetime 的地方,都可以使用 numpy.datetime64。例如

time = np.arange('2005-02-01', '2005-02-02', dtype='datetime64[h]')
plt.plot(time)

使用 Pillow 寫入動畫#

現在可以使用 Pillow 作為動畫寫入器。目前支援的輸出格式為 gif (Pillow>=3.4) 和 webp (Pillow>=5.0)。例如使用方法如下

from __future__ import division

from matplotlib import pyplot as plt
from matplotlib.animation import FuncAnimation, PillowWriter

fig, ax = plt.subplots()
line, = plt.plot([0, 1])

def animate(i):
   line.set_ydata([0, i / 20])
   return [line]

anim = FuncAnimation(fig, animate, 20, blit=True)
anim.save("movie.gif", writer=PillowWriter(fps=24))
plt.show()

滑桿 UI 小工具可以貼齊離散值#

滑桿 UI 小工具可以採用選擇性引數 valstep。這樣做會強制滑桿僅採用離散值,從 valmin 開始,並以 valstep 的大小遞增計數到 valmax

如果 closedmax==True,則滑桿也會貼齊 valmax

已將 capstylejoinstyle 屬性新增至 Collection#

Collection 類別現在具有可自訂的 capstylejoinstyle 屬性。這允許使用者例如設定誤差線的 capstyle

pad kwarg 新增至 ax.set_title#

方法 Axes.set_title 現在具有 pad kwarg,其指定從軸頂部到繪製標題位置的距離。pad 的單位為點,預設值是 (已經存在的) rcParams["axes.titlepad"] 的值 (預設值:6.0)。

Matplotlib 中 2 種色彩的比較#

由於 Matplotlib 中的色彩可以用多種方式指定,因此新增了 matplotlib.colors.same_color 方法,該方法會檢查兩種 colors 是否相同。

極座標圖的自動縮放會貼齊原點#

如果自動限制接近零,則在極座標圖中自動設定限制現在會將徑向限制貼齊零。這表示從零開始繪圖不會自動縮放以包含徑向軸上的小負值。

仍然可以使用 set_ylim 以通常的方式手動設定限制。

PathLike 支援#

在 Python 3.6+ 上,savefigimsaveimread 和動畫寫入器現在接受 os.PathLike 作為輸入。

Axes.tick_params 可以設定格線屬性#

Tick 物件保留格線以及刻度標記及其標籤。Axis.set_tick_paramsAxes.tick_paramspyplot.tick_params 現在具有關鍵字引數 'grid_color'、'grid_alpha'、'grid_linewidth' 和 'grid_linestyle',用於覆寫 rcParams 中的預設值:'grid.color' 等。

Axes.imshow 將 RGB 值剪裁到有效範圍#

Axes.imshow 接收超出範圍的 RGB 或 RGBA 值時,現在會記錄警告並將它們裁剪到有效範圍。舊的行為會將數值包回範圍內,這經常隱藏離群值並使 RGB 圖像的解讀變得不可靠。

matplotlibrc 中用於放置 xaxis 和 yaxis 刻度標籤的屬性#

matplotlibrc 中引入四個新的布林屬性,用於 xaxis 和 yaxis 刻度標籤的預設位置,分別是 rcParams["xtick.labeltop"] (預設值:False)、rcParams["xtick.labelbottom"] (預設值:True)、rcParams["ytick.labelright"] (預設值:False) 和 rcParams["ytick.labelleft"] (預設值:True)。這些屬性也可以在 rcParams 中更改。

用於 gtk3 的 PGI 綁定#

GTK3 後端現在可以使用 PGI 而不是 PyGObject。PGI 是一個相當不完整的 GObject 綁定,因此不建議使用;它的主要優點是在 Travis 上可用(因此允許對 gtk3agg 和 gtk3cairo 後端進行 CI 測試)。

綁定選擇規則如下:- 如果 gi 已經被導入,則使用它;否則 - 如果 pgi 已經被導入,則使用它;否則 - 如果可以導入 gi,則使用它;否則 - 如果可以導入 pgi,則使用它;否則 - 拋出錯誤。

因此,要在安裝了兩個綁定的情況下強制使用 PGI,請先導入它。

用於 Qt、WX 和 Tk 畫布的 Cairo 渲染#

新的 Qt4CairoQt5CairoWXCairoTkCairo 後端允許 Qt、Wx 和 Tk 畫布使用 Cairo 渲染,而不是 Agg。

在新 ToolManager 中增加了對 QT 的支持#

現在可以將 ToolManager 與 Qt5 一起使用,例如

import matplotlib

matplotlib.use('QT5AGG')
matplotlib.rcParams['toolbar'] = 'toolmanager'
import matplotlib.pyplot as plt

plt.plot([1,2,3])
plt.show()

目前將新的 Tool 類視為實驗性的,API 可能會更改,也許 rcParam 也會更改

主要範例 工具管理器 顯示了更多細節,只需調整標頭以使用 QT 而不是 GTK3

TkAgg 後端經過重新設計以支援 PyPy#

PyPy 現在可以使用 TkAgg 後端進行繪圖,支援 PyPy 5.9 及更高版本(適用於 python 2.7 的 PyPy 和適用於 python 3.5 的 PyPy)。

Python 日誌記錄庫用於除錯輸出#

Matplotlib 過去(偶爾)使用內部詳細輸出報告器。此版本將這些呼叫轉換為使用標準 Python logging 庫。

不再支援舊的 rcParams verbose.levelverbose.fileo

仍然接受命令列選項 --verbose-helpful--verbose-debug,但已棄用。它們現在等同於設定 logging.INFOlogging.DEBUG

記錄器的根名稱為 matplotlib,可以從程式中以以下方式存取

import logging
mlog = logging.getLogger('matplotlib')

基本用法說明位於 疑難排解 中,開發人員說明位於 貢獻指南 中。

改進的 repr for Transforms#

Transform 現在以更容易閱讀的方式縮排其 repr

In [1]: l, = plt.plot([]); l.get_transform()
Out[1]:
CompositeGenericTransform(
   TransformWrapper(
      BlendedAffine2D(
            IdentityTransform(),
            IdentityTransform())),
   CompositeGenericTransform(
      BboxTransformFrom(
            TransformedBbox(
               Bbox(x0=-0.05500000000000001, y0=-0.05500000000000001, x1=0.05500000000000001, y1=0.05500000000000001),
               TransformWrapper(
                  BlendedAffine2D(
                        IdentityTransform(),
                        IdentityTransform())))),
      BboxTransformTo(
            TransformedBbox(
               Bbox(x0=0.125, y0=0.10999999999999999, x1=0.9, y1=0.88),
               BboxTransformTo(
                  TransformedBbox(
                        Bbox(x0=0.0, y0=0.0, x1=6.4, y1=4.8),
                        Affine2D(
                           [[ 100.    0.    0.]
                           [   0.  100.    0.]
                           [   0.    0.    1.]])))))))