更改为默认样式

Matplotlib2.0中最重要的更改是对默认样式的更改。

虽然不可能为所有情况选择最佳的默认值,但这些默认值在最常见的情况下设计得很好。

提供了“经典”样式表,因此恢复为1.x默认值是一行python

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

这个 matplotlibrc 文件 有关如何持久和有选择地恢复其中许多更改的详细信息。

颜色、颜色周期和颜色映射

默认属性周期中的颜色

默认属性周期中的颜色已从 ['b', 'g', 'r', 'c', 'm', 'y', 'k'] to the category10 color palette used by Vegad3 最初在Tableau开发。

(Source code , pngpdf

../_images/dflt_style_changes-1.png

除了更改颜色外,还添加了指定颜色的其他方法。以前,默认颜色是红色、绿色、蓝色、青色、洋红、黄色和黑色的单字符速记符号。这使得它们易于键入并可用于 plot 但是,新的默认颜色只能通过十六进制值指定。要在属性外部访问这些颜色,请循环颜色的符号 'CN' 在哪里 N 取值0-9,添加以表示前10种颜色 rcParams["axes.prop_cycle"] (default: cycler('color', ['#1f77b4', '#ff7f0e', '#2ca02c', '#d62728', '#9467bd', '#8c564b', '#e377c2', '#7f7f7f', '#bcbd22', '#17becf'])) . 见 指定颜色 了解更多详细信息。

要恢复旧的颜色循环,请使用

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

或设置

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

在你 matplotlibrc 文件。

Colormap

由使用的新默认颜色映射 matplotlib.cm.ScalarMappable instances is 'viridis' (aka option D

(Source code, png, pdf)

../_images/dflt_style_changes-2.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 _, pngpdf

../_images/dflt_style_changes-3.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 正在保存实例。

如果您试图将图形中的文本与外部文本直接匹配,这将产生后果。

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

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 文件。

此外, forward 克瓦格 set_size_inches 现在默认为 True 改善互动体验。后端画布,用于调整绑定的大小 matplotlib.figure.Figure 必须通过 forward=False 以避免循环行为。此默认值不可配置。

绘图功能

scatter

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

  • 散点图中元素的默认大小现在基于 rcParams["lines.markersize"] (default: 6.0) 所以它与 plot(X, Y, 'o') . 旧值为20,新值为36(6^2)。
  • 散点标记不再有黑色边缘。
  • 如果未指定标记的颜色,它将跟随属性循环,从 Axes .

(Source code _, pngpdf

../_images/dflt_style_changes-4.png

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

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

但是,这也会影响默认的标记大小 plot . 要在每次呼叫的基础上恢复经典行为,请通过以下限制:

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

plot

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

  • 默认线宽从1增加到1.5
  • '--'':''-.' 改变了
  • 现在,破折号图案按线条宽度缩放。

(Source code _, pngpdf

../_images/dflt_style_changes-5.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 _, pngpdf

../_images/dflt_style_changes-6.png

这也改变了 errorbar() 因为默认情况下“caplines”列表为空。

可以通过以下设置还原以前的默认值:

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

或通过设置:

errorbar.capsize : 3

在你 matplotlibrc 文件。

boxplot

以前,箱线图是由一堆样式组成的,不管好坏,这些样式都是从Matlab继承来的。大多数元素是蓝色的,但中间带是红色的。传单(离群值)是黑色加符号(“+”),胡须是虚线,如果没有绘制(实心和黑色)封口,就会产生歧义。

对于新的默认值,除了中值线和平均线(如果绘制),所有内容都是黑色的,它们设置为当前颜色循环的前两个元素。另外,默认的传单标记现在是空心圆,它保持了加号的重叠能力,而不会使数据太过模糊。

(Source code _, pngpdf

../_images/dflt_style_changes-7.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_between and fill_betweenx

fill_betweenfill_betweenx 两者都遵循补丁颜色循环。

(Source code _, pngpdf

../_images/dflt_style_changes-8.png

如果通过 facecolorscolor 关键字参数,则颜色不循环。

要恢复以前的行为,请显式传递关键字参数 facecolors='C0' 方法调用。

修补边缘和颜色

大多数艺术家都画了一个补丁 (~matplotlib.axes.Axes.bar~matplotlib.axes.Axes.pie 等)默认情况下不再有黑色边缘。默认面颜色现在为 'C0' 而不是 'b' .

(Source code _, pngpdf

../_images/dflt_style_changes-9.png

可以通过以下设置还原以前的默认值:

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

或设置:

patch.facecolor        : b
patch.force_edgecolor  : True

在你 matplotlibrc 文件。

hexbin

的默认值 linecolor 克沃格 hexbin 已从更改 'none''face' . 如果现在提供“无”,则六边形周围不会绘制线条边缘。

bar and barh

的默认值 align 克沃格 barbarh 从变 'edge''center' .

(Source code _, pngpdf

../_images/dflt_style_changes-10.png

要恢复以前的行为,请显式传递关键字参数 align='edge' 方法调用。

孵化

图案填充中线条的颜色现在由

  • 如果明确设置了边颜色,请将其用于图案填充颜色。
  • 如果未显式设置边缘颜色,请使用 rcParams["hatch.color"] (default: 'black') 这是在艺术家创作的时候。

图案填充图案中的线条宽度现在可由rcparams配置。 rcParams["hatch.linewidth"] (default: 1.0) ,默认为1点。行宽的旧行为因后端而异:

  • 0.1 PT
  • SVG:1 PT
  • PS:1 PX
  • 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具有相同的外观。拉丁语、希腊语、西里尔文、亚美尼亚语、格鲁吉亚语、希伯来语和阿拉伯语是 all supported (但从右到左的渲染仍不由Matplotlib处理)。此外,dejavu还包含一组emoji符号。

(Source code _, pngpdf

../_images/dflt_style_changes-111.png

DejaVu Sans PDF sample for full coverage .

数学课文

使用内置数学呈现引擎(mathtext)时,默认的数学字体已从“计算机现代”(即类似于 Latex )更改为“dejavu sans”。如果使用了tex后端(即 text.usetexTrue

(Source code _, pngpdf

../_images/dflt_style_changes-12.png

(Source code _, pngpdf

../_images/dflt_style_changes-13.png

要还原为旧行为,请设置:

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

或设置:

mathtext.fontset: cm
mathtext.rm : serif

在你 matplotlibrc 文件。

这个 rcParam 在绘制文本时进行咨询,而不是在创建艺术家时进行咨询。因此给定的 canvas 将使用相同的字体集。

传说

  • 默认情况下,图例中显示的点数现在为1。
  • 默认图例位置为 'best' ,因此图例将自动放置在一个位置,以最小化与数据的重叠。
  • 现在,图例默认值包括圆角、较浅的边界以及部分透明的边界和背景。

(Source code _, pngpdf

../_images/dflt_style_changes-14.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 _, pngpdf

../_images/dflt_style_changes-15.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 .

小区布局

自动限制

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

(Source code _, pngpdf

../_images/dflt_style_changes-16.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 _, pngpdf

../_images/dflt_style_changes-17.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 文件。

蜱数

默认值 Locator 用于X和Y轴的是 AutoLocator 它试图找到一些最大数目的间隔很好的节拍。定位器现在包含一个算法来估计将为刻度标签留出空间的最大刻度数。默认情况下,它还确保至少有两个记号可见。

(Source code _, pngpdf

../_images/dflt_style_changes-18.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公司 用于将最大值设置为任意整数值、字符串“auto”或其默认值“none”(等于“auto”)。使用“自动”设置时,最大数字将不大于9,并将根据轴的长度(以刻度字体大小为单位)减小。与自动定位器的情况一样,启发式算法减少了重叠刻度线标签的发生率,但并不能防止重叠。

刻度标签格式

LogFormatter 次要刻度的标记

当轴视图限制范围小于或等于两个主要刻度之间的间隔时,日志轴上的次要刻度现在被标记。见 LogFormatter 详情。使用时关闭次要刻度线标签 mpl.style.use('classic') ,但不能通过 rcParams .

(Source code _, pngpdf

../_images/dflt_style_changes-19.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 _, pngpdf

../_images/dflt_style_changes-20.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'

或设置:

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现在遵循一些与样式相关的RCPARAM,而不是使用硬编码的默认值。这些包括:
    • xtick.major.width
    • ytick.major.width
    • xtick.color
    • ytick.color
    • axes.linewidth
    • axes.edgecolor
    • grid.color
    • grid.linewidth
    • grid.linestyle