默认样式的更改#
Matplotlib 2.0 中最重要的变化是默认样式的更改。
虽然不可能为所有情况选择最佳默认值,但这些设计旨在在最常见的情况下良好运行。
提供了一个“经典”样式表,因此恢复到 1.x 默认值只需一行 Python 代码
import matplotlib.style
import matplotlib as mpl
mpl.style.use('classic')
有关如何持久且选择性地恢复其中许多更改的详细信息,请参阅matplotlibrc 文件。
颜色、颜色循环和颜色映射#
默认属性循环中的颜色#
默认属性循环中的颜色已从 ['b', 'g', 'r', 'c', 'm', 'y', 'k']
更改为由 Vega 和 d3 使用的 category10 调色板,该调色板最初由 Tableau 开发。

除了更改颜色外,还添加了一种额外的指定颜色的方法。以前,默认颜色是红、绿、蓝、青、洋红、黄和黑的单字符速记符号。这使得它们易于输入并在 plot
中的缩写样式字符串中使用,但新的默认颜色仅通过十六进制值指定。为了在属性循环之外访问这些颜色,添加了颜色表示法 'CN'
,其中 N
的取值范围为 0-9,用于表示 rcParams["axes.prop_cycle"]
中的前 10 种颜色(默认值: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
文件中。
颜色映射#
matplotlib.cm.ScalarMappable
实例使用的新默认颜色映射是 'viridis'(又称 选项 D)。

要了解颜色理论以及 'viridis' 如何生成,请观看 Nathaniel Smith 和 Stéfan van der Walt 在 SciPy2015 上的演讲。有关其他替代方案以及用于创建颜色映射的工具的更多详细信息,请参阅此处。有关 Matplotlib 中所有可用颜色映射的详细信息,请参阅在 Matplotlib 中选择颜色映射。
可以使用以下方法恢复以前的默认值
mpl.rcParams['image.cmap'] = 'jet'
或设置
image.cmap : 'jet'
在您的 matplotlibrc
文件中;但是,强烈不建议这样做。
交互式图形#
默认的交互式图形背景颜色已从灰色变为白色,这与保存时使用的默认背景颜色一致。
可以通过以下方式恢复以前的默认值
mpl.rcParams['figure.facecolor'] = '0.75'
或通过设置
figure.facecolor : '0.75'
在您的 matplotlibrc
文件中。
网格线#
网格线的默认样式已从黑色虚线更改为更粗的实心浅灰色线。

可以使用以下方法恢复以前的默认值
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_inches
的 forward
关键字参数现在默认为 True
,以改善交互体验。调整其绑定的 matplotlib.figure.Figure
大小的后端画布必须传递 forward=False
以避免循环行为。此默认值不可配置。
绘图函数#
scatter
#
对 scatter
的默认行为进行了以下更改
散点图中元素的默认大小现在基于
rcParams["lines.markersize"]
(默认值:6.0
),因此与plot(X, Y, 'o')
一致。旧值为 20,新值为 36 (6^2)。散点标记不再具有黑色边缘。
如果未指定标记的颜色,它将遵循属性循环,从
Axes
上的“patches”循环中提取。

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
与
'--'
、':'
和'-.'
关联的虚线模式已更改虚线模式现在随线宽缩放

可以通过设置以下选项来恢复以前的默认值
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
#
默认情况下,误差线末端不显示帽线。

这也改变了 errorbar()
的返回值,因为“caplines”列表将默认为空。
可以通过设置以下选项来恢复以前的默认值
mpl.rcParams['errorbar.capsize'] = 3
或通过设置
errorbar.capsize : 3
在您的 matplotlibrc
文件中。
boxplot
#
以前,箱线图由混合的样式组成,这些样式或多或少继承自 Matlab。大多数元素是蓝色的,但中位数是红色的。飞点(异常值)是黑色的加号 ('+'),胡须是虚线,如果未绘制(实心黑色)帽线,则会造成歧义。
对于新的默认设置,除了中位数和均值线(如果绘制)之外,所有内容都是黑色的,它们被设置为当前颜色循环的前两个元素。此外,默认的飞点标记现在是空心圆,这使得加号标记能够在不太多遮挡数据的情况下重叠。

可以通过设置以下选项来恢复以前的默认值
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
和 fill_betweenx
#
fill_between
和 fill_betweenx
都遵循补丁颜色循环。

如果通过 facecolors
或 color
关键字参数设置了面颜色,则颜色不会循环。
要恢复以前的行为,请显式将关键字参数 facecolors='C0'
传递给方法调用。
补丁边缘和颜色#
大多数用补丁绘制的图形(如 ~matplotlib.axes.Axes.bar
, ~matplotlib.axes.Axes.pie
等)默认不再有黑色边缘。默认面颜色现在是 'C0'
而不是 'b'
。

可以通过设置以下选项来恢复以前的默认值
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',则六边形周围不会绘制线边缘。
bar
和 barh
#
bar
和 barh
的 align
关键字参数的默认值已从 'edge'
更改为 'center'
。

要恢复以前的行为,请显式将关键字参数 align='edge'
传递给方法调用。
填充图案#
填充图案中线条的颜色现在由以下方式确定
如果明确设置了边缘颜色,则将其用作填充图案颜色
如果未明确设置边缘颜色,则使用
rcParams["hatch.color"]
(默认值:'black'
),该值在图形创建时查找。
填充图案中线条的宽度现在可通过 rcParams rcParams["hatch.linewidth"]
(默认值: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 相同。拉丁语、希腊语、西里尔语、亚美尼亚语、格鲁吉亚语、希伯来语和阿拉伯语都受支持(但 Matplotlib 仍未处理从右到左的渲染)。此外,DejaVu 还包含一部分表情符号。

有关完整覆盖范围,请参阅 DejaVu Sans PDF 示例。
数学文本#
使用内置数学渲染引擎 (mathtext) 时的默认数学字体已从“Computer Modern”(即类似 LaTeX 的)更改为“DejaVu Sans”。如果使用 TeX 后端(即 text.usetex
为 True
),则此更改无效。


要恢复旧行为,请设置
mpl.rcParams['mathtext.fontset'] = 'cm'
mpl.rcParams['mathtext.rm'] = 'serif'
或设置
mathtext.fontset: cm
mathtext.rm : serif
在您的 matplotlibrc
文件中。
此 rcParam
在绘制文本时(而不是创建图形时)被查阅。因此,给定 canvas
上的所有数学文本都将使用相同的字体集。
图例#
默认情况下,图例中显示的点的数量现在是 1。
默认图例位置是
'best'
,因此图例将自动放置在最小化与数据重叠的位置。图例默认值现在包括圆角、更浅的边框以及部分透明的边框和背景。

可以通过设置以下选项来恢复以前的默认值
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'
,并且默认情况下它会在颜色映射之前重新采样数据(包括向上和向下采样)。

要恢复以前的行为,请设置
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%。

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
或设置
axes.autolimit_mode: round_numbers
axes.xmargin: 0
axes.ymargin: 0
在您的 matplotlibrc
文件中。
Z 顺序#
刻度线和网格线现在绘制在填充等实体元素之上,但在线条之下。要恢复以前将刻度线和网格线绘制在线条之上的行为,请设置
rcParams['axes.axisbelow'] = False
。
刻度线#
方向#
为了减少刻度线与数据的冲突,默认刻度线现在默认向外。此外,刻度线现在只绘制在底部和左侧边框上,以防止出现“豪猪”外观,并使子图之间更清晰地分隔。

要恢复以前的行为,请设置
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 轴使用的默认 Locator
是 AutoLocator
,它尝试找到(最多某个最大数量)“均匀”间隔的刻度线。该定位器现在包含一个算法,用于估算将为刻度标签留出空间的刻度线最大数量。默认情况下,它还确保至少有两个刻度线可见。

除了使用 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
使用的算法已得到改进,这在某些情况下可能会改变刻度位置的选择。这也会影响内部使用 MaxNLocator
的 AutoLocator
。
对于对数刻度轴,默认定位器是 LogLocator
。以前,最大刻度线数量设置为 15,且无法更改。现在有一个 numticks 关键字参数,用于将最大值设置为任何整数值、字符串 'auto' 或其默认值 None(等同于 'auto')。在 'auto' 设置下,最大数量将不大于 9,并将根据轴的长度(以刻度字体大小为单位)进行减少。与 AutoLocator 的情况一样,启发式算法减少了刻度标签重叠的发生,但不能完全阻止它。
刻度标签格式#
LogFormatter
次要刻度标签#
现在,当对数轴的视图限制范围小于或等于两个主刻度线之间的间隔时,次要刻度线会被标记。有关详细信息,请参阅 LogFormatter
。使用 mpl.style.use('classic')
时,次要刻度线标签会被关闭,但不能通过 rcParams
独立控制。

ScalarFormatter
带偏移的刻度标签格式#
在默认的 rcParams["axes.formatter.useoffset"]
(默认值:True
)下,当可以节省 4 位或更多数字时,将使用偏移量。这可以通过新的 rcParams["axes.formatter.offset_threshold"]
控制(默认值:4
)。要恢复以前使用偏移量节省 2 位或更多数字的行为,请使用 rcParams['axes.formatter.offset_threshold'] = 2
。

AutoDateFormatter
格式字符串#
默认日期格式现在都基于 ISO 格式,即最慢变化的值在前。日期格式化程序可通过 date.autoformatter.*
rcParams 进行配置。
阈值(刻度间隔 >=) |
rcParam |
经典 |
v2.0 |
---|---|---|---|
365 天 |
|
|
|
30 天 |
|
|
|
1 天 |
|
|
|
1 小时 |
|
|
|
1 分钟 |
|
|
|
1 秒 |
|
|
|
1 微秒 |
|
|
|
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