0.54 版本变更#
MATLAB 接口#
dpi#
为了让图像在不同后端之间保持一致渲染,我曾添加了一个 PIXELS_PER_INCH 的技巧,但一些后端使用了它。这只会让事情变得复杂。因此您可能会发现某些字体大小和线宽与以前不同。对此造成的不便深表歉意。您应该将 dpi 设置为屏幕的准确值以获得真实尺寸。
pcolor 和 scatter#
MATLAB 接口 API 有两项更改,均涉及补丁绘图命令。为了提高效率,pcolor 和 scatter 已被重写为使用多边形集合(polygon collections),这是 matplotlib.collections 中一组新的对象,旨在实现对大量对象的有效处理。这些新的集合使得在 Python 层面无需循环即可构建大型散点图或 pcolor 图成为可能,并且比其前身显著更快。原始的 pcolor 和 scatter 函数保留为 pcolor_classic 和 scatter_classic。
pcolor 的返回值是一个 PolyCollection。大多数适用于矩形或其他补丁的属性也适用于 PolyCollections,例如,您可以说
c = scatter(blah, blah)
c.set_linewidth(1.0)
c.set_facecolor('r')
c.set_alpha(0.5)
或
c = scatter(blah, blah)
set(c, 'linewidth', 1.0, 'facecolor', 'r', 'alpha', 0.5)
由于集合是一个单一对象,您不再需要循环 scatter 或 pcolor 的返回值来为整个列表设置属性。
如果您希望集合中的不同元素在某个属性上有所不同,例如具有不同的线宽,请参阅 matplotlib.collections 中关于如何按序列设置属性的讨论。
对于 scatter,size 参数现在以点平方(符号的点面积)为单位,与 MATLAB 中一样,而不再像以前那样以数据坐标为单位。在数据坐标中使用大小导致了几个问题。因此,您需要相应地调整 size 参数或使用 scatter_classic。
mathtext 间距#
由于我不清楚的原因(最终我会修复),间距在字体组中不再起作用。但是,我添加了三个新的间距命令来弥补这一点:''(常规间距),'/'(小间距)和 'hspace{frac}',其中 frac 是字体大小(以点为单位)的一个分数。您需要在字体字符串中引用空格,例如
title(r'$\rm{Histogram\ of\ IQ:}\ \mu=100,\ \sigma=15$')
对象接口 - 应用程序员#
自动缩放#
x 轴和 y 轴实例不再具有自动缩放视图。这些现在由 axes.autoscale_view 处理。
坐标轴创建#
您不应再使用 OO API 实例化自己的 Axes。相反,像以前一样创建一个 Figure,并且代替
f = Figure(figsize=(5,4), dpi=100)
a = Subplot(f, 111)
f.add_axis(a)
使用
f = Figure(figsize=(5,4), dpi=100)
a = f.add_subplot(111)
也就是说,add_axis 不再存在,已被替换为
add_axes(rect, axisbg=defaultcolor, frameon=True)
add_subplot(num, axisbg=defaultcolor, frameon=True)
Artist 方法#
如果您定义自己的 Artist,则需要将 _draw 方法重命名为 draw
边界框#
matplotlib.transforms.Bound2D 已被 matplotlib.transforms.Bbox 替换。如果您想从 left, bottom, width, height(Bound2D 的签名)构建一个 bbox,请使用 matplotlib.transforms.lbwh_to_bbox,如下所示:
bbox = clickBBox = lbwh_to_bbox(left, bottom, width, height)
Bbox 具有与 Bound2D 不同的 API。例如,如果您想获取 bbox 的宽度和高度
旧:
width = fig.bbox.x.interval()
height = fig.bbox.y.interval()
新:
width = fig.bbox.width()
height = fig.bbox.height()
对象构造函数#
您不再需要将 bbox、dpi 或 transforms 传递给各种 Artist 构造函数。以前创建线条和矩形的方式很繁琐,因为您必须向 Line2D 和 Rectangle 类传递许多与对象几何形状和属性不直接相关的属性。现在,当您调用 axes.add_line 或 axes.add_patch 时,默认值会添加到对象中,因此它们对用户是隐藏的。
如果您想在这些对象上定义自定义变换,请调用 o.set_transform(trans),其中 trans 是一个 Transformation 实例。
在以前的版本中,如果您想在数据坐标中添加自定义线条,您需要这样做:
l = Line2D(dpi, bbox, x, y,
color = color,
transx = transx,
transy = transy,
)
现在您只需要
l = Line2D(x, y, color=color)
并且坐标轴将为您设置变换(除非您已经设置了自己的变换,在这种情况下它会保持不变)
变换#
整个变换架构已被重写。以前,x 和 y 变换存储在 xaxis 和 yaxis 实例中。这种方法的问题是它只允许可分离变换(x 和 y 变换彼此不依赖)。但对于极坐标等情况,它们是相互依赖的。现在,变换同时作用于 x 和 y。有一个新的基类 matplotlib.transforms.Transformation 以及两个具体实现:matplotlib.transforms.SeparableTransformation 和 matplotlib.transforms.Affine。SeparableTransformation 是通过输入的边界框(这决定了输入的矩形坐标系,即 x 和 y 视图限制)、显示的边界框以及可能的 x 和 y 非线性变换来构建的。两个最常用的变换,数据坐标 -> 显示 和 坐标轴坐标 -> 显示,可分别通过 ax.transData 和 ax.transAxes 获得。请参阅使用坐标轴坐标的 alignment_demo.py。
此外,现在变换应该快得多,原因有二:
它们完全用扩展代码编写
因为它们同时作用于 x 和 y,所以可以在一个循环中完成整个变换。以前我这样做过:
xt = sx*func(x) + tx yt = sy*func(y) + ty
尽管这是在 numerix 中完成的,但它仍然涉及 6 个 length(x) 的循环(x 和 y 各自的乘法、加法和函数求值)。现在所有这些都在一次遍历中完成。
如果您正在使用变换和边界框来获取数据坐标中的光标位置,现在方法调用有所不同。请参阅已更新的 examples/coords_demo.py,其中展示了如何执行此操作。
同样,如果您正在使用 artist 边界框通过 GUI 在画布上选择项目,则 bbox 方法也有所不同。您需要查看已更新的 examples/object_picker.py。
请参阅 unit/transforms_unit.py 以获取许多使用新变换的示例。