默认样式的更改#
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'] 更改为 Vega 和 d3 最初在 Tableau 开发的 category10 调色板。
(Source code, 2x.png, 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 文件中。
色图#
matplotlib.cm.ScalarMappable 实例使用的新默认颜色映射是 'viridis'(即 选项 D)。
(Source code, 2x.png, png)
要了解色彩理论的介绍以及 '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 文件中。
网格线#
网格线的默认样式已从黑色虚线改为更粗的浅灰色实线。
(Source code, 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
在你的 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"](default:6.0),因此与plot(X, Y, 'o')一致。旧值为 20,新值为 36(6^2)。散点标记不再有黑色边缘。
如果未指定标记的颜色,它将遵循属性循环,从
Axes上的 'patches' 循环中提取。
(Source code, 2x.png, 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, 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
在你的 matplotlibrc 文件中。
errorbar#
默认情况下,误差线的末端没有帽。
(Source code, 2x.png, png)
这也会改变 errorbar() 的返回值,因为默认情况下 'caplines' 列表将为空。
可以通过设置恢复之前的默认值:
mpl.rcParams['errorbar.capsize'] = 3
或者通过设置
errorbar.capsize : 3
在你的 matplotlibrc 文件中。
boxplot#
之前,箱线图由各种风格混杂而成,这些风格无论好坏,都是从Matlab继承而来的。大多数元素是蓝色的,但中位数是红色的。飞点(异常值)是黑色的加号符号('+'),而须线是虚线,如果没有绘制(实心和黑色)的帽线,这会造成歧义。
对于新的默认设置,除了中位数和平均线(如果绘制)之外,所有内容都是黑色的,这些线条的颜色设置为当前颜色循环的前两个元素。此外,默认的异常值标记现在是空心圆圈,这保持了加号符号在不掩盖太多数据的情况下重叠的能力。
(Source code, 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
在你的 matplotlibrc 文件中。
fill_between 和 fill_betweenx#
fill_between 和 fill_betweenx 都遵循补丁颜色循环。
(Source code, 2x.png, png)
如果通过 facecolors 或 color 关键字参数设置了 facecolor,那么颜色将不会循环。
要恢复之前的行为,请在方法调用中显式传递关键字参数 facecolors='C0'。
补丁边缘和颜色#
大多数使用补丁绘制的艺术家(如 ~matplotlib.axes.Axes.bar、~matplotlib.axes.Axes.pie 等)默认不再有黑色边缘。默认的面部颜色现在是 'C0' 而不是 'b'。
(Source code, 2x.png, 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',则不会在六边形周围绘制线条边缘。
bar 和 barh#
对于 bar 和 barh ,align kwarg 的默认值从 'edge' 更改为 'center'。
(Source code, 2x.png, png)
要显式恢复之前的行为,请在方法调用中传递关键字参数 align='edge'。
孵化#
填充图案中线条的颜色现在由
如果边缘颜色被显式设置,则使用该颜色作为填充颜色
如果未明确设置边缘颜色,则使用
rcParams["hatch.color"](default:'black'),该颜色在艺术家创建时查找。
现在,阴影图案中线条的宽度可以通过 rcParams rcParams["hatch.linewidth"] (default: 1.0) 进行配置,默认值为 1 点。旧的线条宽度行为因后端不同而有所不同:
PDF: 0.1 pt
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 的外观相同。拉丁文、希腊文、西里尔文、亚美尼亚文、格鲁吉亚文、希伯来文和阿拉伯文 `均受支持 <https://dejavu-fonts.github.io/>`__(但 matplotlib 仍不处理从右到左的渲染)。此外,DejaVu 包含一个表情符号子集。
(Source code, 2x.png, png)
数学文本#
在使用内置数学渲染引擎(mathtext)时,默认的数学字体已从“Computer Modern”(即类似LaTeX的字体)更改为“DejaVu Sans”。如果使用TeX后端(即 text.usetex 为 True),此更改将无效。
(Source code, 2x.png, png)
(Source code, 2x.png, png)
要恢复到旧的行为,请设置:
mpl.rcParams['mathtext.fontset'] = 'cm'
mpl.rcParams['mathtext.rm'] = 'serif'
或设置:
mathtext.fontset: cm
mathtext.rm : serif
在你的 matplotlibrc 文件中。
这个 rcParam 是在绘制文本时被查询的,而不是在创建艺术家时。因此,给定 canvas 上的所有数学文本将使用相同的字体集。
图例#
默认情况下,图例中显示的点数现在是 1。
默认的图例位置是
'best',因此图例将被自动放置在一个位置,以最小化与数据的叠加。图例的默认设置现在包括圆角、较浅的边界以及部分透明的边界和背景。
(Source code, 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)
在你的 matplotlibrc 文件中。
图像#
插值#
imshow 的默认插值方法是 'nearest',并且在颜色映射之前默认会对数据进行重采样(包括上采样和下采样)。
(Source code, 2x.png, 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, 2x.png, 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-order#
刻度和网格现在绘制在填充等高线等实心元素之上,但在线条之下。要恢复之前在线条之上绘制刻度和网格的行为,请设置
rcParams['axes.axisbelow'] = False。
Ticks#
方向#
为了减少刻度线与数据的碰撞,默认情况下刻度线现在默认指向外部。此外,刻度线现在仅在底部和左侧边框上绘制,以防止出现刺猬般的外观,并为子图之间提供更清晰的分离。
(Source code, 2x.png, 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轴使用的默认 Locator 是 AutoLocator,它会尝试找到,最多到某个最大数量,'美观'间隔的刻度。该定位器现在包含一个算法,用于估计能留出刻度标签空间的刻度最大数量。默认情况下,它还确保至少有两个刻度可见。
(Source code, 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 关键字参数,可以将其设置为任意整数值,或者设置为字符串 'auto',或者设置为其默认值 None,这相当于 'auto'。使用 'auto' 设置时,最大值将不大于9,并且会根据轴的长度(以刻度字体大小的单位表示)减少。与 AutoLocator 的情况一样,启发式算法减少了重叠刻度标签的发生,但并不能完全避免。
刻度标签格式化#
LogFormatter 次刻度的标签#
当轴视图限制范围小于或等于两个主刻度之间的间隔时,对数轴上的次刻度现在会被标记。详情请参见 LogFormatter。在使用 mpl.style.use('classic') 时,次刻度标记会被关闭,但无法通过 rcParams 独立控制。
(Source code, 2x.png, 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, 2x.png, png)
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.linewidthaxes.edgecolor
网格颜色
grid.linewidthgrid.linestyle