預設樣式的變更#

matplotlib 2.0 中最重要的變更就是預設樣式的變更。

雖然不可能為所有情況選出最佳預設值,但這些設計旨在於最常見的情況下運作良好。

提供「經典」樣式表,因此只需一行 python 程式碼即可還原為 1.x 的預設值

import matplotlib.style
import matplotlib as mpl
mpl.style.use('classic')

有關如何持續且選擇性地還原許多這些變更的詳細資訊,請參閱matplotlibrc 檔案

色彩、色彩循環和色彩映射#

預設屬性循環中的色彩#

預設屬性循環中的色彩已從 ['b', 'g', 'r', 'c', 'm', 'y', 'k'] 變更為 Vegad3 使用的 category10 色彩調色板,該調色板最初由 Tableau 開發。

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

除了變更色彩外,還新增了一種指定色彩的其他方法。先前,預設色彩是紅色、綠色、藍色、青色、洋紅色、黃色和黑色的單字元簡短表示法。這使得它們易於輸入,並可在 plot 中的縮寫樣式字串中使用,但是新的預設色彩僅透過十六進位值指定。若要在屬性循環之外存取這些色彩,新增了色彩表示法 'CN',其中 N 的值為 0-9,表示 rcParams["axes.prop_cycle"] (預設值:cycler('color', ['#1f77b4', '#ff7f0e', '#2ca02c', '#d62728', '#9467bd', '#8c564b', '#e377c2', '#7f7f7f', '#bcbd22', '#17becf'])) 中的前 10 種色彩。如需詳細資訊,請參閱指定色彩

若要還原舊的色彩循環,請使用

from cycler import cycler
mpl.rcParams['axes.prop_cycle'] = cycler(color='bgrcmyk')

或在您的 matplotlibrc 檔案中設定

axes.prop_cycle    : cycler('color', 'bgrcmyk')

色彩映射#

新的預設色彩映射表,由 matplotlib.cm.ScalarMappable 實例使用,為 'viridis' (又名 選項 D)。

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

若要了解色彩理論以及 'viridis' 如何產生,請觀看 Nathaniel Smith 和 Stéfan van der Walt 在 SciPy2015 的演講。請參閱 這裡,了解更多關於其他替代方案以及用於建立色彩映射表的工具的詳細資訊。關於 Matplotlib 中所有可用的色彩映射表之詳細資訊,請參閱 在 Matplotlib 中選擇色彩映射表

可以使用以下方式還原先前的預設值:

mpl.rcParams['image.cmap'] = 'jet'

或在您的 matplotlibrc 檔案中設定:

image.cmap    : 'jet'

,但不建議這樣做。

互動式圖表#

預設的互動式圖表背景顏色已從灰色變更為白色,這與儲存時使用的預設背景顏色一致。

可以使用以下方式還原先前的預設值:

mpl.rcParams['figure.facecolor'] = '0.75'

或者透過設定:

figure.facecolor : '0.75'

網格線#

網格線的預設樣式已從黑色虛線變更為較粗的實心淺灰色線條。

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

可以使用以下方式還原先前的預設值:

mpl.rcParams['grid.color'] = 'k'
mpl.rcParams['grid.linestyle'] = ':'
mpl.rcParams['grid.linewidth'] = 0.5

或者透過設定:

grid.color       :   k       # grid color
grid.linestyle   :   :       # dotted
grid.linewidth   :   0.5     # in points

圖表大小、字體大小和螢幕 dpi#

用於螢幕顯示的預設 dpi 已從 80 dpi 變更為 100 dpi,與儲存檔案的預設 dpi 相同。由於此變更,螢幕顯示現在更接近於儲存檔案的「所見即所得」。為了使圖表在像素方面保持相同的大小,以便在螢幕上保持大致相同的大小,預設的圖表大小已從 8x6 英吋減少到 6.4x4.8 英吋。因此,用於標題、刻度標籤和軸標籤的預設字體大小也縮小了,以保持它們相對於圖表整體大小的比例。依預設,已儲存影像的 dpi 現在是正在儲存的 Figure 實例的 dpi。

如果您嘗試將圖表中的文字與外部文字直接匹配,這將會產生影響。

可以使用以下方式還原先前的預設值:

mpl.rcParams['figure.figsize'] = [8.0, 6.0]
mpl.rcParams['figure.dpi'] = 80
mpl.rcParams['savefig.dpi'] = 100

mpl.rcParams['font.size'] = 12
mpl.rcParams['legend.fontsize'] = 'large'
mpl.rcParams['figure.titlesize'] = 'medium'

或者透過設定:

figure.figsize   : [8.0, 6.0]
figure.dpi       : 80
savefig.dpi      : 100

font.size        : 12.0
legend.fontsize  : 'large'
figure.titlesize : 'medium'

在您的 matplotlibrc 檔案中。

此外,set_size_inchesforward 關鍵字引數現在預設為 True,以改善互動體驗。調整其綁定的 matplotlib.figure.Figure 大小的後端畫布必須傳遞 forward=False 以避免循環行為。此預設值不可設定。

繪圖函數#

scatter#

scatter 的預設行為進行了以下變更:

  • 散佈圖中元素的預設大小現在基於 rcParams["lines.markersize"] (預設值:6.0),因此它與 plot(X, Y, 'o') 一致。舊值為 20,新值為 36 (6^2)。

  • 散佈圖標記不再有黑色邊緣。

  • 如果未指定標記的顏色,則它會遵循屬性週期,從 Axes 上的 'patches' 週期中提取。

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

只能透過 mpl.style.use('classic') 來恢復 scatter 的經典預設行為。標記大小可以透過以下方式恢復:

mpl.rcParam['lines.markersize'] = np.sqrt(20)

但是,這也會影響 plot 的預設標記大小。若要按每次呼叫恢復經典行為,請傳遞以下關鍵字引數:

classic_kwargs = {'s': 20, 'edgecolors': 'k', 'c': 'b'}

plot#

plot 的預設行為進行了以下變更:

  • 預設線寬從 1 增加到 1.5

  • '--'':''-.' 相關聯的虛線樣式已變更

  • 虛線樣式現在會隨線寬縮放

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

可以透過設定以下內容來還原先前的預設值:

mpl.rcParams['lines.linewidth'] = 1.0
mpl.rcParams['lines.dashed_pattern'] = [6, 6]
mpl.rcParams['lines.dashdot_pattern'] = [3, 5, 1, 5]
mpl.rcParams['lines.dotted_pattern'] = [1, 3]
mpl.rcParams['lines.scale_dashes'] = False

或者透過設定:

lines.linewidth   : 1.0
lines.dashed_pattern : 6, 6
lines.dashdot_pattern : 3, 5, 1, 5
lines.dotted_pattern : 1, 3
lines.scale_dashes: False

errorbar#

依預設,誤差線末端的帽形圖不存在。

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

這也會變更 errorbar() 的傳回值,因為 'caplines' 的列表依預設會是空的。

可以透過設定以下內容來還原先前的預設值:

mpl.rcParams['errorbar.capsize'] = 3

或者透過設定:

errorbar.capsize : 3

boxplot#

先前,箱形圖是由各式各樣的樣式組成,這些樣式好壞參半,繼承自 Matlab。大多數元素是藍色的,但中位數是紅色的。離群值 (異常值) 是黑色加號符號 ('+'),而鬚線是虛線,如果沒有繪製 (實心且黑色) 的帽形圖,則會造成混淆。

對於新的預設值,除了中位數和平均值線 (如果繪製) 之外,所有內容都是黑色的,中位數和平均值線會設定為目前色彩週期的前兩個元素。此外,預設的離群值標記現在是空心圓形,這保留了加號符號重疊而不遮蔽太多數據的能力。

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

可以透過設定以下內容來還原先前的預設值:

mpl.rcParams['boxplot.flierprops.color'] = 'k'
mpl.rcParams['boxplot.flierprops.marker'] = '+'
mpl.rcParams['boxplot.flierprops.markerfacecolor'] = 'none'
mpl.rcParams['boxplot.flierprops.markeredgecolor'] = 'k'
mpl.rcParams['boxplot.boxprops.color'] = 'b'
mpl.rcParams['boxplot.whiskerprops.color'] = 'b'
mpl.rcParams['boxplot.whiskerprops.linestyle'] = '--'
mpl.rcParams['boxplot.medianprops.color'] = 'r'
mpl.rcParams['boxplot.meanprops.color'] = 'r'
mpl.rcParams['boxplot.meanprops.marker'] = '^'
mpl.rcParams['boxplot.meanprops.markerfacecolor'] = 'r'
mpl.rcParams['boxplot.meanprops.markeredgecolor'] = 'k'
mpl.rcParams['boxplot.meanprops.markersize'] = 6
mpl.rcParams['boxplot.meanprops.linestyle'] = '--'
mpl.rcParams['boxplot.meanprops.linewidth'] = 1.0

或者透過設定:

boxplot.flierprops.color:           'k'
boxplot.flierprops.marker:          '+'
boxplot.flierprops.markerfacecolor: 'none'
boxplot.flierprops.markeredgecolor: 'k'
boxplot.boxprops.color:             'b'
boxplot.whiskerprops.color:         'b'
boxplot.whiskerprops.linestyle:     '--'
boxplot.medianprops.color:          'r'
boxplot.meanprops.color:            'r'
boxplot.meanprops.marker:           '^'
boxplot.meanprops.markerfacecolor:  'r'
boxplot.meanprops.markeredgecolor:  'k'
boxplot.meanprops.markersize:        6
boxplot.meanprops.linestyle:         '--'
boxplot.meanprops.linewidth:         1.0

fill_betweenfill_betweenx#

fill_betweenfill_betweenx 都遵循補丁顏色週期。

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

如果透過 facecolorscolor 關鍵字引數設定了 facecolor,則顏色不會循環。

若要還原先前的行為,請將關鍵字引數 facecolors='C0' 明確傳遞給方法呼叫。

補丁邊緣和顏色#

大多數使用圖塊繪製的藝術家(例如 ~matplotlib.axes.Axes.bar~matplotlib.axes.Axes.pie 等)預設不再有黑色邊緣。預設的填充顏色現在是 'C0',而不是 'b'

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

可以透過設定以下內容來還原先前的預設值:

mpl.rcParams['patch.force_edgecolor'] = True
mpl.rcParams['patch.facecolor'] = 'b'

或者透過設定:

patch.facecolor        : b
patch.force_edgecolor  : True

hexbin#

hexbinlinecolor 關鍵字引數的預設值已從 'none' 變更為 'face'。如果現在提供 'none',則不會在六邊形周圍繪製線條邊緣。

barbarh#

barbarhalign kwarg 的預設值已從 'edge' 變更為 'center'

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

若要還原先前的行為,請明確地將關鍵字引數 align='edge' 傳遞給方法呼叫。

影線#

影線中線條的顏色現在由以下方式決定:

  • 如果明確設定了邊緣顏色,則使用該顏色作為影線顏色

  • 如果未明確設定邊緣顏色,則使用 rcParams["hatch.color"] (預設值: 'black'),此設定會在建立藝術家時查詢。

影線圖案中線條的寬度現在可以透過 rcParams rcParams["hatch.linewidth"] (預設值: 1.0) 進行設定,其預設值為 1 點。舊的線條寬度行為依據後端而有所不同

  • PDF: 0.1 點

  • SVG: 1.0 點

  • PS: 1 像素

  • Agg: 1 像素

無法同時還原所有後端的舊線條寬度行為,但可以透過設定來還原單一後端的行為

mpl.rcParams['hatch.linewidth'] = 0.1  # previous pdf hatch linewidth
mpl.rcParams['hatch.linewidth'] = 1.0  # previous svg hatch linewidth

PS 和 Agg 後端的行為與 DPI 有關,因此

mpl.rcParams['figure.dpi'] = dpi
mpl.rcParams['savefig.dpi'] = dpi  # or leave as default 'figure'
mpl.rcParams['hatch.linewidth'] = 1.0 / dpi  # previous ps and Agg hatch linewidth

沒有直接的 API 層級控制影線顏色或線條寬度。

現在,影線圖案的呈現密度是一致的,與 DPI 無關。先前,高 DPI 圖形的密度會高於預設值,而低 DPI 圖形的密度會較低。無法直接還原此舊行為,但可以透過重複影線規範來增加密度。

字型#

一般文字#

預設字型已從 "Bitstream Vera Sans" 變更為 "DejaVu Sans"。DejaVu Sans 有額外的國際和數學字元,但在其他方面與 Bitstream Vera Sans 的外觀相同。拉丁文、希臘文、西里爾文、亞美尼亞文、喬治亞文、希伯來文和阿拉伯文都支援(但 matplotlib 仍然不處理從右到左的渲染)。此外,DejaVu 還包含一組表情符號子集。

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

請參閱DejaVu Sans PDF 範例以取得完整涵蓋範圍

數學文字#

使用內建數學渲染引擎 (mathtext) 時,預設的數學字型已從 "Computer Modern" (即類似 LaTeX) 變更為 "DejaVu Sans"。如果使用 TeX 後端 (即 text.usetexTrue),則此變更無效。

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

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

若要還原舊的行為,請設定

mpl.rcParams['mathtext.fontset'] = 'cm'
mpl.rcParams['mathtext.rm'] = 'serif'

或在您的 matplotlibrc 檔案中設定

mathtext.fontset: cm
mathtext.rm : serif

rcParam 在繪製文字時查詢,而非在建立藝術家時查詢。因此,在給定 畫布上的所有 mathtext 都將使用相同的字型集。

圖例#

  • 預設情況下,圖例中顯示的點數現在為 1。

  • 預設的圖例位置為 'best',因此圖例將自動放置在可最大程度減少與資料重疊的位置。

  • 圖例預設值現在包含圓角、較淺的邊界,以及部分透明的邊界和背景。

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

可以透過設定以下內容來還原先前的預設值:

mpl.rcParams['legend.fancybox'] = False
mpl.rcParams['legend.loc'] = 'upper right'
mpl.rcParams['legend.numpoints'] = 2
mpl.rcParams['legend.fontsize'] = 'large'
mpl.rcParams['legend.framealpha'] = None
mpl.rcParams['legend.scatterpoints'] = 3
mpl.rcParams['legend.edgecolor'] = 'inherit'

或者透過設定:

legend.fancybox      : False
legend.loc           : upper right
legend.numpoints     : 2      # the number of points in the legend line
legend.fontsize      : large
legend.framealpha    : None    # opacity of legend frame
legend.scatterpoints : 3 # number of scatter points
legend.edgecolor     : inherit   # legend edge color ('inherit'
                                 # means it uses axes.edgecolor)

影像#

插值#

imshow 的預設插值方法現在為 'nearest',並且預設會在色彩對應之前重新取樣資料 (向上和向下取樣)。

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

若要還原先前的行為,請設定

mpl.rcParams['image.interpolation'] = 'bilinear'
mpl.rcParams['image.resample'] = False

或在您的 matplotlibrc 檔案中設定

image.interpolation  : bilinear  # see help(imshow) for options
image.resample  : False

色彩對應管線#

先前,輸入資料會先正規化,然後色彩對應,然後重新取樣為螢幕所需的解析度。這表示最終的重新取樣是在色彩空間中完成的。由於色彩對應通常在 RGB 空間中不是線性的,因此最終影像中可能會出現不在色彩對應中的色彩。此錯誤透過幾乎完全重新檢修影像處理程式碼來解決。

現在,輸入資料會先正規化,然後重新取樣為正確的解析度 (在正規化的資料空間中),然後色彩對應到 RGB 空間。這可確保最終影像中只會出現色彩對應中的色彩。(如果您的檢視器隨後重新取樣影像,則人工因素可能會再次出現。)

無法還原先前的行為。

陰影處理#

  • 光線來源陰影處理的預設陰影處理模式,在 matplotlib.colors.LightSource.shade 中,現在為 overlay。先前,它是 hsv

繪圖配置#

自動限制#

先前的自動縮放行為是找到「漂亮」的整數作為包含資料限制的檢視限制,但如果資料碰巧落在靠近所選「整數」限制的垂直或水平線上,則可能會產生不佳的圖形。新的預設值將檢視限制設定為比資料範圍寬 5%。

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

x 和 y 方向的邊距大小分別由 'axes.xmargin''axes.ymargin' rcParams 控制。視圖限制是否應為「整數」由 rcParams["axes.autolimit_mode"] (預設值: 'data') 控制。在原始的 'round_number' 模式中,視圖限制與刻度重合。

可以使用以下方式還原先前的預設值:

mpl.rcParams['axes.autolimit_mode'] = 'round_numbers'
mpl.rcParams['axes.xmargin'] = 0
mpl.rcParams['axes.ymargin'] = 0

或在您的 matplotlibrc 檔案中設定:

axes.autolimit_mode: round_numbers
axes.xmargin: 0
axes.ymargin: 0

Z 軸順序#

  • 刻度和網格現在繪製在實體元素(例如填滿的輪廓)之上,但在線條之下。若要返回先前在線條上方繪製刻度和網格的行為,請設定 rcParams['axes.axisbelow'] = False

刻度#

方向#

為了減少刻度標記與資料的衝突,預設刻度現在預設為向外指向。此外,刻度現在僅繪製在底部和左側軸脊上,以防止出現豪豬外觀,並在子圖之間提供更清晰的分隔。

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

若要還原先前的行為,請設定

mpl.rcParams['xtick.direction'] = 'in'
mpl.rcParams['ytick.direction'] = 'in'
mpl.rcParams['xtick.top'] = True
mpl.rcParams['ytick.right'] = True

或在您的 matplotlibrc 檔案中設定

xtick.top: True
xtick.direction: in

ytick.right: True
ytick.direction: in

刻度數量#

用於 x 和 y 軸的預設 LocatorAutoLocator,它會嘗試尋找(最多到某個最大數量)間隔「良好」的刻度。定位器現在包含一個演算法來估計最大刻度數量,這些刻度將為刻度標籤留下空間。預設情況下,它還確保至少有兩個刻度可見。

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

除了使用 mpl.style.use('classic') 之外,沒有其他方法可以還原為預設的先前行為。在逐軸的基礎上,您可以透過以下方式控制現有的定位器:

ax.xaxis.get_major_locator().set_params(nbins=9, steps=[1, 2, 5, 10])

或建立新的 MaxNLocator

import matplotlib.ticker as mticker
ax.set_major_locator(mticker.MaxNLocator(nbins=9, steps=[1, 2, 5, 10])

MaxNLocator 使用的演算法已改進,這可能會在某些情況下改變刻度位置的選擇。這也會影響 AutoLocator,它會在內部使用 MaxNLocator

對於對數縮放軸,預設定位器是 LogLocator。先前,最大刻度數設定為 15,且無法變更。現在有一個 _numticks_ kwarg 可以將最大值設定為任何整數值、字串 'auto' 或預設值 None,這相當於 'auto'。使用 'auto' 設定時,最大數量不會超過 9,並且會根據軸的長度(以刻度字型大小為單位)縮減。與 AutoLocator 的情況一樣,啟發式演算法會減少刻度標籤重疊的情況,但不會避免重疊。

刻度標籤格式設定#

LogFormatter 次要刻度的標籤#

當軸視圖限制範圍小於或等於兩個主要刻度之間的間隔時,對數軸上的次要刻度現在會加上標籤。請參閱 LogFormatter 以取得詳細資訊。當使用 mpl.style.use('classic') 時,次要刻度標籤會關閉,但無法透過 rcParams 獨立控制。

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

ScalarFormatter 使用偏移的刻度標籤格式設定#

使用預設的 rcParams["axes.formatter.useoffset"] (預設值:True) 時,當它可以節省 4 個或更多位數時,將會使用偏移。這可以使用新的 rcParams["axes.formatter.offset_threshold"] (預設值:4) 控制。若要還原為先前使用偏移以節省 2 個或更多位數的行為,請使用 rcParams['axes.formatter.offset_threshold'] = 2

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

AutoDateFormatter 格式字串#

預設日期格式現在全部基於 ISO 格式,也就是最慢移動的值排在第一位。日期格式設定器可透過 date.autoformatter.* rcParams 設定。

閾值(刻度間隔 >= 於)

rcParam

經典

v2.0

365 天

'date.autoformatter.year'

'%Y'

'%Y'

30 天

'date.autoformatter.month'

'%b %Y'

'%Y-%m'

1 天

'date.autoformatter.day'

'%b %d %Y'

'%Y-%m-%d'

1 小時

'date.autoformatter.hour'

'%H:%M:%S'

'%H:%M'

1 分鐘

'date.autoformatter.minute'

'%H:%M:%S.%f'

'%H:%M:%S'

1 秒

'date.autoformatter.second'

'%H:%M:%S.%f'

'%H:%M:%S'

1 微秒

'date.autoformatter.microsecond'

'%H:%M:%S.%f'

'%H:%M:%S.%f'

Python 的 %x%X 日期格式可能特別適用於根據目前地區設定格式化日期。

先前的預設值可以透過以下方式還原:

mpl.rcParams['date.autoformatter.year'] = '%Y'
mpl.rcParams['date.autoformatter.month'] = '%b %Y'
mpl.rcParams['date.autoformatter.day'] = '%b %d %Y'
mpl.rcParams['date.autoformatter.hour'] = '%H:%M:%S'
mpl.rcParams['date.autoformatter.minute'] = '%H:%M:%S.%f'
mpl.rcParams['date.autoformatter.second'] = '%H:%M:%S.%f'
mpl.rcParams['date.autoformatter.microsecond'] = '%H:%M:%S.%f'

或在您的 matplotlibrc 檔案中設定:

date.autoformatter.year   : %Y
date.autoformatter.month  : %b %Y
date.autoformatter.day    : %b %d %Y
date.autoformatter.hour   : %H:%M:%S
date.autoformatter.minute : %H:%M:%S.%f
date.autoformatter.second : %H:%M:%S.%f
date.autoformatter.microsecond : %H:%M:%S.%f

mplot3d#

  • mplot3d 現在會遵循一些與樣式相關的 rcParams,而不是使用硬式編碼的預設值。這些包括:

    • xtick.major.width

    • ytick.major.width

    • xtick.color

    • ytick.color

    • axes.linewidth

    • axes.edgecolor

    • grid.color

    • grid.linewidth

    • grid.linestyle