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。