0.54 版本变更#
MATLAB 接口#
dpi#
几个后端使用了我在尝试使图像在不同后端一致渲染时添加的 PIXELS_PER_INCH 技巧。这只会使事情复杂化。因此,您可能会发现某些字体大小和线条宽度与之前不同。对于给您带来的不便,我们深表歉意。您应该为您的屏幕设置一个准确的 dpi 值以获得真实尺寸。
pcolor 和 scatter#
MATLAB 接口 API 有两个变化,都涉及补丁绘图命令。为了提高效率,pcolor 和 scatter 已被重写以使用多边形集合,这是 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 以了解如何将属性设置为序列的讨论。
对于散点图,size 参数现在以点^2(符号在点中的面积)为单位,如 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)
艺术家方法#
如果你定义了自己的艺术家,你需要将 _draw 方法重命名为 draw
边界框#
matplotlib.transforms.Bound2D 已被 matplotlib.transforms.Bbox 取代。如果你想从左、底、宽、高(Bound2D 的签名)构造一个 bbox,请使用 matplotlib.transforms.lbwh_to_bbox,如下所示:
bbox = clickBBox = lbwh_to_bbox(left, bottom, width, height)
Bbox 的 API 与 Bound2D 不同。例如,如果你想获取 bbox 的宽度和高度
旧:
width = fig.bbox.x.interval()
height = fig.bbox.y.interval()
新:
width = fig.bbox.width()
height = fig.bbox.height()
对象构造器#
你不再需要将 bbox、dpi 或变换传递给各种 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 个长度为 x 的 for 循环(乘法、加法和函数求值各为 x 和 y)。现在所有这些都在一次遍历中完成。
如果你使用变换和边界框来获取光标在数据坐标中的位置,现在方法调用会有所不同。请参阅更新后的 examples/coords_demo.py 示例,它展示了如何实现这一点。
同样地,如果你使用艺术家边界框通过GUI在画布上选择项目,边界框方法会有所不同。你需要查看更新后的examples/object_picker.py。
关于使用新转换的许多示例,请参见 unit/transforms_unit.py。