Matplotlib 3.8.0 的新功能 (2023 年 9 月 13 日)#

如需上次修訂以來所有問題和提取請求的列表,請參閱 3.10.0 (2024 年 12 月 13 日) 的 GitHub 統計資料

型別提示#

Matplotlib 現在為大多數公開 API 提供第一方 PEP484 風格的型別提示檔案。

雖然仍被視為臨時性的且可能變更(有時我們還無法完全指定我們想要的),但它們應為型別檢查許多常見用法模式以及與許多編輯器/IDE 整合提供合理的基礎。

繪圖和註解的改進#

支援自訂文字和註解的抗鋸齒#

matplotlib.pyplot.annotate()matplotlib.pyplot.text() 現在支援參數 antialiased。當 antialiased 設定為 True 時,抗鋸齒將會應用於文字。當 antialiased 設定為 False 時,抗鋸齒將不會應用於文字。當 antialiased 未指定時,抗鋸齒將由 rcParams["text.antialiased"] 設定(預設值:True),於 TextAnnotation 物件建立時。範例

mpl.text.Text(.5, .5, "foo\nbar", antialiased=True)
plt.text(0.5, 0.5, '6 inches x 2 inches', antialiased=True)
ax.annotate('local max', xy=(2, 1), xytext=(3, 1.5), antialiased=False)

如果文字包含數學表達式,則 antialiased 會應用於整個文字。範例

# no part will be antialiased for the text below
plt.text(0.5, 0.25, r"$I'm \sqrt{x}$", antialiased=False)

另請注意,刻度標籤的抗鋸齒會在使用 rcParams["text.antialiased"] 設定(預設值:True)時建立(通常在建立 Figure 時),且之後無法變更。

此外,透過這個新功能,您可能需要確保您在相同的環境下建立並儲存/顯示圖表

# previously this was a no-op, now it is what works
with rccontext(text.antialiased=False):
    fig, ax = plt.subplots()
    ax.annotate('local max', xy=(2, 1), xytext=(3, 1.5))
    fig.savefig('/tmp/test.png')


# previously this had an effect, now this is a no-op
fig, ax = plt.subplots()
ax.annotate('local max', xy=(2, 1), xytext=(3, 1.5))
with rccontext(text.antialiased=False):
    fig.savefig('/tmp/test.png')

AutoMinorLocator 分割的 rcParams#

已新增 rcParams rcParams["xtick.minor.ndivs"](預設值:'auto')和 rcParams["ytick.minor.ndivs"](預設值:'auto'),以啟用設定預設分割數;如果設定為 auto,則分割數將由主刻度之間的距離決定。

Axline 設定器和獲取器#

axes.Axes.axline 返回的物件現在支援其 xy1xy2slope 屬性的獲取器和設定器方法。

line1.get_xy1()
line1.get_slope()
line2.get_xy2()
line1.set_xy1(.2, .3)
line1.set_slope(2.4)
line2.set_xy2(.1, .6)

等高線圖的剪裁#

contourcontourf 現在接受 clip_path 參數。

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.patches as mpatches

x = y = np.arange(-3.0, 3.01, 0.025)
X, Y = np.meshgrid(x, y)
Z1 = np.exp(-X**2 - Y**2)
Z2 = np.exp(-(X - 1)**2 - (Y - 1)**2)
Z = (Z1 - Z2) * 2

fig, ax = plt.subplots()
patch = mpatches.RegularPolygon((0, 0), 5, radius=2,
                                transform=ax.transData)
ax.contourf(X, Y, Z, clip_path=patch)

plt.show()

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

Axes.ecdf#

新的 Axes 方法 ecdf 允許繪製經驗累積分布函數,而無需任何分箱。

import matplotlib.pyplot as plt
import numpy as np

fig, ax = plt.subplots()
ax.ecdf(np.random.randn(100))

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

Figure.get_suptitle()Figure.get_supxlabel()Figure.get_supylabel()#

這些方法分別返回 Figure.suptitle()Figure.supxlabel()Figure.supylabel() 設定的字串。

Ellipse.get_vertices()Ellipse.get_co_vertices()#

這些方法返回橢圓長軸和短軸頂點的座標。此外,還新增了一個範例展示庫示範,展示如何向橢圓新增箭頭,以顯示橢圓的順時針或逆時針旋轉。為了將箭頭精確放置在橢圓上,使用了頂點的座標。

移除 label_outer() 中的內部刻度#

到目前為止,label_outer() 僅移除刻度標籤。刻度線仍然可見。現在可以透過新的參數 label_outer(remove_inner_ticks=True) 設定。

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(0, 2 * np.pi, 100)

fig, axs = plt.subplots(2, 2, sharex=True, sharey=True,
                        gridspec_kw=dict(hspace=0, wspace=0))

axs[0, 0].plot(x, np.sin(x))
axs[0, 1].plot(x, np.cos(x))
axs[1, 0].plot(x, -np.cos(x))
axs[1, 1].plot(x, -np.sin(x))

for ax in axs.flat:
    ax.grid(color='0.9')
    ax.label_outer(remove_inner_ticks=True)

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

可設定的圖例陰影#

圖例的 shadow 參數現在除了布林值之外,還接受字典。字典可以包含 patches.Patch 的任何關鍵字。例如,這允許使用者設定圖例陰影的顏色和/或透明度

ax.legend(loc='center left', shadow={'color': 'red', 'alpha': 0.5})

並控制陰影位置

ax.legend(loc='center left', shadow={"ox":20, "oy":-20})

目前不支援透過 rcParams["legend.shadow"] 設定(預設值:False)。

MultipleLocator 的 offset 參數#

現在可以指定 offset 來將所有刻度偏移給定值。

import matplotlib.pyplot as plt
import matplotlib.ticker as mticker

_, ax = plt.subplots()
ax.plot(range(10))
locator = mticker.MultipleLocator(base=3, offset=0.3)
ax.xaxis.set_major_locator(locator)

plt.show()

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

新增新的有效顏色格式 (matplotlib_color, alpha)#

import matplotlib.pyplot as plt
from matplotlib.patches import Rectangle

fig, ax = plt.subplots()

rectangle = Rectangle((.2, .2), .6, .6,
                      facecolor=('blue', 0.2),
                      edgecolor=('green', 0.5))
ax.add_patch(rectangle)

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

使用者可以使用新的顏色規格 (matplotlib_color, alpha) 來定義顏色。請注意,明確的 alpha 關鍵字參數將會覆蓋 (matplotlib_color, alpha) 中的 alpha 值。

可以控制圓餅圖陰影#

現在,pieshadow 參數可以是一個字典,允許更精細地控制使用的 Shadow 補丁。

PolyQuadMesh 是一個用於繪製四邊形網格的新類別#

pcolor 之前回傳的是一個扁平的 PolyCollection,其中僅包含有效的多邊形(未被遮罩)。現在,我們回傳一個 PolyQuadMesh,它是一個混合類別,結合了二維陣列和網格坐標處理的實用性,但仍繼承了 PolyCollection 的繪圖方法,這使得它比從 pcolormesh 回傳的標準 QuadMesh 能夠更精確地控制渲染屬性。這個新類別繼承自 PolyCollection,因此其行為應該與之前相同。這個新類別會追蹤使用者的遮罩,並適當地更新傳送至渲染器的多邊形。

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

陰影的色調可以被控制#

現在,Shadow 補丁有一個 shade 參數來控制陰影的深淺。如果為 1,陰影為黑色;如果為 0,陰影的顏色與被陰影的補丁相同。預設值(之前是固定的)為 0.7。

SpinesProxy 現在支援呼叫 set() 方法#

現在可以呼叫例如 ax.spines[:].set(visible=False)

允許使用關鍵字引數設定刻度標籤字型#

Axes.tick_params 現在接受一個 labelfontfamily 關鍵字,該關鍵字可以與其他文字物件分開變更刻度標籤的字型。

Axis.tick_params(labelfontfamily='monospace')

圖形、軸線和圖例版面配置#

用於 savefig 的 pad_inches="layout"#

當使用 constrained 或 compressed 佈局時,

savefig(filename, bbox_inches="tight", pad_inches="layout")

現在將使用在佈局引擎上定義的邊距大小。

新增一個公用方法來修改 Legend 的位置#

現在可以在定義 Legend 位置後進行調整。

from matplotlib import pyplot as plt

fig = plt.figure()
ax = fig.add_subplot(1, 1, 1)

x = list(range(-100, 101))
y = [i**2 for i in x]

ax.plot(x, y, label="f(x)")
ax.legend()
ax.get_legend().set_loc("right")
# Or
# ax.get_legend().set(loc="right")

plt.show()

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

rcParams['legend.loc'] 現在接受浮點數元組輸入#

rcParams["legend.loc"] (預設值:'best') rcParams 現在接受浮點數元組輸入,與 Legendloc 關鍵字引數相同。這允許使用者以更靈活且一致的方式設定圖例的位置。

數學文字改進#

這些改進針對 Mathtext,Matplotlib 原生的類 TeX 數學解析器(請參閱 撰寫數學表達式,不要與 Matplotlib 直接使用 LaTeX 混淆:使用 LaTeX 渲染文字)。

粗體數學文字命令 \boldsymbol#

支援在數學文字中使用 \boldsymbol{} 命令

要將符號變更為粗體,請將文字放在如下所示的字型命令中

r'$\boldsymbol{a+2+\alpha}$'
\[\boldsymbol{a+2+\alpha}\]

mathtext 有更多可調整大小的分隔符號#

已新增 \lgroup\rgroup 可調整大小的分隔符號。

以下分隔符號名稱先前已支援,但現在可以使用 \left\right 來調整大小

  • \lbrace\rbrace\leftbrace\rightbrace

  • \lbrack\rbrack

  • \leftparen\rightparen

使用這些沒有明顯的優勢。相反,添加它們是為了完整性。

mathtext 文件改進#

文件已更新為直接從解析器獲取資訊。這表示(幾乎)所有支援的符號、運算符號等都顯示在 撰寫數學表達式 中。

mathtext 現在支援 \substack#

\substack 可用於在方程式中建立多行下標或上標。

若要使用它,請將數學式放在如下所示的 substack 命令中

r'$\sum_{\substack{1\leq i\leq 3\\ 1\leq j\leq 5}}$'

mathtext 現在支援 \middle 分隔符號#

已新增 \middle 分隔符號,現在可以與 \left\right 分隔符號一起使用

若要使用 middle 命令,請將其放在 \left\right 分隔符號命令之間,如下所示

r'$\left( \frac{a}{b} \middle| q \right)$'

mathtext 運算符號#

在使用 Unicode 字型時,已新增和更正了許多運算符號。此外,已將正確的間距新增至先前的一些運算符號。特別是,已更正用於 \gnapprox\lnapprox\leftangle\rightangle 的字元。

mathtext 間距校正#

由於文件已更新,因此許多關係符號和運算符號的間距都被歸類為如此,因此將會適當地間隔。

mathtext 現在支援 \text#

\text 可用於在方程式中取得直立文字,並取得純粹的破折號 (-)。

import matplotlib.pyplot as plt
plt.text(0.1, 0.5, r"$a = \sin(\phi) \text{ such that } \phi = \frac{x}{y}$")
plt.text(0.1, 0.3, r"$\text{dashes (-) are retained}$")

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

Illustration of the newly added \text command, showing that it renders as normal text, including spaces, despite being part of an equation. Also show that a dash is not rendered as a minus when part of a \text command.

粗斜體 mathtext 指令 \mathbfit#

支援在 mathtext 中使用粗斜體字型樣式,透過 \mathbfit{} 指令。

若要將字型變更為粗體和斜體,請將文字包在字型指令中,如下所示

r'$\mathbfit{\eta \leq C(\delta(\eta))}$
\[\mathbfit{\eta \leq C(\delta(\eta))}\]

3D 繪圖改進#

為 3D 繪圖指定刻度和軸標籤位置#

現在您可以為 3D 繪圖指定刻度和軸標籤的位置。

import matplotlib.pyplot as plt

positions = ['lower', 'upper', 'default', 'both', 'none']
fig, axs = plt.subplots(2, 3, figsize=(12, 8),
                        subplot_kw={'projection': '3d'})
for ax, pos in zip(axs.flatten(), positions):
    for axis in ax.xaxis, ax.yaxis, ax.zaxis:
        axis.set_label_position(pos)
        axis.set_ticks_position(pos)
    title = f'position="{pos}"'
    ax.set(xlabel='x', ylabel='y', zlabel='z', title=title)
axs[1, 2].axis('off')

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

3D 懸停座標#

先前在 3D 繪圖中顯示的 x、y、z 座標會顯示無意義的值。 此問題已修正,現在會報告滑鼠游標正下方視窗窗格上的座標。 當使用正交投影沿主要軸方向檢視 3D 繪圖,或當 2D 繪圖已投影到其中一個 3D 軸窗格時,此功能最為實用。 請注意,目前仍然無法直接顯示繪製資料點的座標。

3D 繪圖可以共用視角#

3D 繪圖現在可以共用相同的視角,因此當您旋轉一個繪圖時,其他繪圖也會旋轉。 這可以透過新增軸時使用 shareview 關鍵字引數,或是使用現有 3D 軸的 ax1.shareview(ax2) 方法來完成。

其他改進#

macosx:新圖形可以於視窗或索引標籤中開啟#

有一個新的 rcParams["macosx.window_mode"] (預設值: 'system') rcParam,可控制如何使用 macosx 後端開啟新圖形。 預設值為 system,使用系統設定,或者可以指定 tabwindow,以明確選擇用於開啟新圖形的模式。

matplotlib.mpl_toolkits 現在是隱式命名空間套件#

setuptools 67.3.0 中已棄用 pkg_resources.declare_namespace 之後,matplotlib.mpl_toolkits 現在以隱式命名空間實作,遵循 PEP 420

Plot 指令現在可以使用 "srcset" 製作回應式影像#

plot sphinx 指令 (matplotlib.sphinxext.plot_directive,在 rst 中以 .. plot:: 呼叫) 可以設定為自動製作更高解析度的圖形,並將這些圖形新增至建立的 html 文件中。 在 conf.py

extensions = [
...
    'matplotlib.sphinxext.plot_directive',
    'matplotlib.sphinxext.figmpl_directive',
...]

plot_srcset = ['2x']

將會製作具有雙倍解析度的 png 檔案,以用於 hiDPI 顯示器。產生的 html 檔案將具有類似的影像項目

<img src="../_images/nestedpage-index-2.png" style="" srcset="../_images/nestedpage-index-2.png, ../_images/nestedpage-index-2.2x.png 2.00x" alt="" class="plot-directive "/>