默认样式的更改#

matplotlib 2.0 中最重要的变化是默认样式的变化.

虽然不可能为所有情况选择最佳默认值,但这些默认值旨在在最常见的情况下良好工作.

提供了一个"经典"样式表,因此恢复到 1.x 默认值只需一行 python 代码

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

有关如何持久且有选择地恢复这些更改的详细信息,请参见 The matplotlibrc 文件 .

颜色,颜色循环和颜色图#

默认属性循环中的颜色#

默认属性循环中的颜色已从 ['b', 'g', 'r', 'c', 'm', 'y', 'k'] 更改为 Vegad3 使用的 category10 调色板,该调色板最初由 Tableau 开发.

(Source code, png)

除了更改颜色之外,还添加了一种指定颜色的其他方法.以前,默认颜色是红色,绿色,蓝色,青色,品红色,黄色和黑色的单字符简写符号.这使得它们易于键入,并且可以在 plot 中的缩写样式字符串中使用,但是新的默认颜色仅通过十六进制值指定.为了在属性循环之外访问这些颜色,添加了颜色符号 'CN' ,其中 N 取值 0-9,表示 rcParams["axes.prop_cycle"] (default: 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')

或设置

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

在你的 matplotlibrc 文件中.

Colormap(颜色映射)#

matplotlib.cm.ScalarMappable 实例使用的新默认颜色映射是 'viridis' (又名 option D ).

(Source code, png)

有关颜色理论以及 'viridis' 是如何生成的介绍,请观看 Nathaniel Smith 和 Stéfan van der Walt 在 SciPy2015 上的演讲.有关其他替代方案和用于创建颜色映射的工具的更多详细信息,请参见 here for many more details . 有关 matplotlib 中所有可用颜色映射的详细信息,请参见 在 Matplotlib 中选择颜色映射 .

可以使用以下方式恢复以前的默认设置

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

或设置

image.cmap    : 'jet'

在你的 matplotlibrc 文件中;但是强烈建议不要这样做.

交互式图形#

默认的交互式图形背景颜色已从灰色更改为白色,这与保存时使用的默认背景颜色相匹配.

可以通过以下方式恢复以前的默认设置:

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

或通过设置:

figure.facecolor : '0.75'

在你的 matplotlibrc 文件中.

网格线#

网格线的默认样式已从黑色虚线更改为更粗的实心浅灰色线.

(Source code, 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

在你的 matplotlibrc 文件中.

图形大小,字体大小和屏幕 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 kwarg 现在默认为 True .调整其绑定 matplotlib.figure.Figure 大小的后端画布必须传递 forward=False 以避免循环行为.此默认值不可配置.

绘图函数#

scatter#

scatter 的默认行为进行了以下更改

  • 散点图中元素的默认大小现在基于 rcParams["lines.markersize"] (default: 6.0) ,因此与 plot(X, Y, 'o') 一致.旧值为 20,新值为 36 (6^2).

  • 散点标记不再具有黑色边缘.

  • 如果未指定标记的颜色,它将遵循属性循环,从 Axes 上的 'patches' 循环中提取.

(Source code, png)

scatter 的经典默认行为只能通过 mpl.style.use('classic') 恢复.标记大小可以通过以下方式恢复:

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

然而,这也会影响 plot 的默认标记大小.要恢复每个调用的经典行为,请传递以下kwargs:

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

plot#

plot 的默认行为进行了以下更改

  • 默认线宽从 1 增加到 1.5

  • '--' , ':' , 和 '-.' 关联的虚线模式已更改

  • 虚线模式现在随线宽缩放

(Source code, 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

在你的 matplotlibrc 文件中.

errorbar#

默认情况下,误差条末端的帽子不存在.

(Source code, png)

这也改变了 errorbar() 的返回值,因为 'caplines' 列表默认情况下将为空.

可以通过设置以下项来恢复先前的默认值:

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

或通过设置:

errorbar.capsize : 3

在你的 matplotlibrc 文件中.

boxplot#

以前,箱线图由一种混合的样式组成,这些样式或好或坏,都是从 Matlab 继承的.大多数元素是蓝色的,但中位数是红色的.离群值(异常值)是黑色加号("+"),须线是虚线,如果未绘制(实心和黑色)端帽,则会造成歧义.

对于新的默认值,除了中位数和平均值线(如果绘制)之外,所有内容都是黑色的,它们被设置为当前颜色循环的前两个元素.此外,默认的离群值标记现在是空心圆,这保持了加号重叠而不过多地遮盖数据的能力.

(Source code, 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

在你的 matplotlibrc 文件中.

fill_betweenfill_betweenx#

fill_betweenfill_betweenx 都遵循补丁颜色循环.

(Source code, png)

如果通过 facecolorscolor 关键字参数设置了 facecolor,则颜色不会循环.

要恢复先前的行为,请显式地将关键字参数 facecolors='C0' 传递给方法调用.

补丁边缘和颜色#

默认情况下,大多数用补丁绘制的艺术家( ~matplotlib.axes.Axes.bar , ~matplotlib.axes.Axes.pie 等)不再具有黑色边缘.默认的填充颜色现在是 'C0' 而不是 'b' .

(Source code, png)

可以通过设置以下项来恢复先前的默认值:

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

或通过设置:

patch.facecolor        : b
patch.force_edgecolor  : True

在你的 matplotlibrc 文件中.

hexbin#

hexbin 的 linecolor 关键字参数的默认值已从 'none' 更改为 'face' .如果现在提供 'none',则不会在六边形周围绘制任何线条边缘.

barbarh#

barbarhalign kwarg 的默认值已从 'edge' 更改为 'center' .

(Source code, png)

要恢复先前的行为,请显式地将关键字参数 align='edge' 传递给方法调用.

阴影线#

阴影线中线条的颜色现在由以下因素决定:

  • 如果显式设置了边颜色,则使用该颜色作为阴影线颜色

  • 如果未显式设置边颜色,则使用 rcParams["hatch.color"] (default: 'black') ,该颜色在绘制对象创建时查找.

阴影线图案中线条的宽度现在可以通过 rcParams rcParams["hatch.linewidth"] (default: 1.0) 进行配置,默认为 1 磅.旧的线条宽度行为因后端而异:

  • PDF: 0.1 pt

  • SVG: 1.0 pt

  • PS: 1 px

  • Agg: 1 px

无法同时在所有后端恢复旧的线条宽度行为,但可以通过设置以下内容来恢复单个后端的行为:

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 具有相同的外观.拉丁语,希腊语,西里尔语,亚美尼亚语,格鲁吉亚语,希伯来语和阿拉伯语都 all supported (但 matplotlib 仍然不处理从右到左的渲染).此外,DejaVu 包含表情符号符号的子集.

(Source code, png)

请参阅 DejaVu Sans PDF sample for full coverage .

数学文本#

使用内置数学渲染引擎(mathtext)时,默认数学字体已从"Computer Modern"(即类似 LaTeX)更改为"DejaVu Sans".如果使用 TeX 后端(即 text.usetexTrue ),则此更改无效.

(Source code, png)

(Source code, png)

要恢复到旧的行为,请设置:

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

或设置:

mathtext.fontset: cm
mathtext.rm : serif

在你的 matplotlibrc 文件中.

rcParam 在绘制文本时查询,而不是在创建对象时查询.因此,给定 canvas 上的所有 mathtext 都将使用相同的字体集.

图例#

  • 默认情况下,图例中显示的点数现在为 1.

  • 默认的图例位置是 'best' ,因此图例将自动放置在一个可以最大限度减少与数据重叠的位置.

  • 图例的默认设置现在包括圆角,更浅的边框以及部分透明的边框和背景.

(Source code, 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)

在你的 matplotlibrc 文件中.

图像#

插值#

imshow 的默认插值方法现在是 'nearest' ,并且默认情况下,它会在进行颜色映射之前对数据进行重新采样(包括向上和向下采样).

(Source code, png)

要恢复之前的行为,请设置:

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

或设置:

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

在你的 matplotlibrc 文件中.

颜色映射管道#

以前,输入数据先被归一化,然后进行颜色映射,最后再重新采样到屏幕所需的分辨率.这意味着最后的重新采样是在颜色空间中完成的.由于颜色映射通常在 RGB 空间中不是线性的,因此最终图像中可能会出现不在颜色映射中的颜色.这个问题通过对图像处理代码进行几乎完全的修改来解决.

现在,输入数据先被归一化,然后重新采样到正确的分辨率(在归一化的数据空间中),然后再颜色映射到 RGB 空间.这确保了只有来自颜色映射的颜色才会出现在最终图像中.(如果您的查看器随后对图像进行重新采样,则此伪影可能会重新出现.)

无法恢复之前的行为.

着色#

  • matplotlib.colors.LightSource.shade 中光源着色的默认着色模式现在是 overlay .以前,它是 hsv .

绘图布局#

自动限制#

之前的自动缩放行为是找到"nice"的圆形数字作为视图限制,以包含数据限制,但如果数据恰好落在靠近所选"圆形数字"限制的垂直或水平线上,则可能会产生不良绘图.新的默认设置将视图限制设置为比数据范围宽 5%.

(Source code, png)

x 和 y 方向上的填充大小分别由 'axes.xmargin''axes.ymargin' rcParams 控制.视图限制是否应为"圆形数字"由 rcParams["axes.autolimit_mode"] (default: 'data') 控制.在原始的 'round_number' 模式下,视图限制与刻度线重合.

可以使用以下方式恢复以前的默认设置:

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

或设置:

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

在你的 matplotlibrc 文件中.

Z 轴顺序#

  • 刻度和网格现在绘制在诸如填充轮廓之类的实心元素之上,但在线条之下.要恢复到在线条之上绘制刻度和网格的先前行为,请设置 rcParams['axes.axisbelow'] = False .

刻度#

方向#

为了减少刻度线与数据的冲突,默认刻度线现在默认指向外部.此外,刻度线现在仅绘制在底部和左侧脊柱上,以防止出现豪猪外观,并实现子图之间更清晰的分隔.

(Source code, png)

要恢复之前的行为,请设置:

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

或设置:

xtick.top: True
xtick.direction: in

ytick.right: True
ytick.direction: in

在你的 matplotlibrc 文件中.

刻度线数量#

用于x和y轴的默认 LocatorAutoLocator ,它会尝试找到最多一定数量的间隔"良好"的刻度线.现在,locator包含一种算法,用于估计刻度标签留出空间的最大刻度线数量.默认情况下,它还确保至少有两个刻度线可见.

(Source code, png)

除了使用 mpl.style.use('classic') 之外,没有其他方法可以恢复之前的默认行为.在逐个轴的基础上,您可以通过以下方式控制现有locator:

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 .

对于对数刻度的轴,默认locator是 LogLocator .以前,最大刻度线数设置为15,并且无法更改.现在有一个numticks kwarg,用于将最大值设置为任何整数值,字符串"auto"或其默认值None(等效于"auto").使用"auto"设置时,最大数量将不大于9,并且会根据轴的长度(以刻度字体大小为单位)进行减少.与AutoLocator的情况一样,启发式算法减少了刻度标签重叠的发生率,但不能完全避免.

刻度标签格式化#

LogFormatter 对次要刻度线的标签#

当轴视图限制跨越的范围小于或等于两个主要刻度线之间的间隔时,对数轴上的次要刻度线现在会被标记.有关详细信息,请参见 LogFormatter .当使用 mpl.style.use('classic') 时,次要刻度线标签将被关闭,但无法通过 rcParams 单独控制.

(Source code, png)

带有偏移量的 ScalarFormatter 刻度标签格式化#

使用默认的 rcParams["axes.formatter.useoffset"] (default: True) ,当它可以节省4个或更多位数时,将使用偏移量.这可以通过新的 rcParams["axes.formatter.offset_threshold"] (default: 4) 来控制.要恢复使用偏移量来节省2个或更多位数之前的行为,请使用 rcParams['axes.formatter.offset_threshold'] = 2 .

(Source code, png)

AutoDateFormatter 格式字符串#

默认日期格式现在都基于ISO格式,即最慢移动的值在前.日期格式化程序可以通过 date.autoformatter.* rcParams进行配置.

阈值(刻度间隔 >= than)

rcParam

classic

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'

或者设置:

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

在你的 matplotlibrc 文件中.

mplot3d#

  • mplot3d 现在遵循一些与样式相关的 rcParams,而不是使用硬编码的默认值.这些包括:

    • xtick.major.width

    • ytick.major.width

    • xtick.color

    • ytick.color

    • axes.linewidth

    • axes.edgecolor

    • grid.color

    • grid.linewidth

    • grid.linestyle