默认样式的更改#
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 使用的 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_inches 的 forward 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_between 和 fill_betweenx#
fill_between 和 fill_betweenx 都遵循补丁颜色循环.
(Source code, png)
如果通过 facecolors 或 color 关键字参数设置了 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',则不会在六边形周围绘制任何线条边缘.
bar 和 barh#
bar 和 barh 的 align 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)
数学文本#
使用内置数学渲染引擎(mathtext)时,默认数学字体已从"Computer Modern"(即类似 LaTeX)更改为"DejaVu Sans".如果使用 TeX 后端(即 text.usetex 为 True ),则此更改无效.
(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轴的默认 Locator 是 AutoLocator ,它会尝试找到最多一定数量的间隔"良好"的刻度线.现在,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 天 |
|
|
|
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