Matplotlib 1.5 中的新特性 (2015 年 10 月 29 日)#

备注

matplotlib 1.5 支持 Python 2.7,3.4 和 3.5

交互式 OO 用法#

所有的 Artist 现在都会跟踪他们的内部状态是否已经改变,但是没有通过调用 draw 反映在显示中('stale').因此,可以务实地确定给定的 Figure 是否需要在交互式会话中重新绘制.

为了方便交互式使用, pyplot 中添加了一个 draw_all 方法,它将重新绘制所有 "stale" 的图形.

为了使交互式使用更加方便,matplotlib 现在向 IPython 的 "post_execute" 事件或标准 python REPL 中的 displayhook 注册一个函数,以便在控制返回到 REPL 之前自动调用 plt.draw_all .这确保了 draw 命令被延迟并且只被调用一次.

这样做的结果是,对于交互式后端(包括 %matplotlib notebook )在交互模式下(使用 plt.ion() )

import matplotlib.pyplot as plt
fig, ax = plt.subplots()
ln, = ax.plot([0, 1, 4, 9, 16])
plt.show()
ln.set_color('g')

将自动更新绘图为绿色.随后对 Artist 对象的任何修改也会这样做.

这是 pyplot 内部结构更大规模的整合和简化的第一步.

使用带标签的数据,如 pandas DataFrames#

将数组作为输入的绘图方法现在也可以使用带标签的数据并解包这些数据.

这意味着以下两个示例生成相同的绘图:

示例

df = pandas.DataFrame({"var1":[1,2,3,4,5,6], "var2":[1,2,3,4,5,6]})
plt.plot(df["var1"], df["var2"])

示例

plt.plot("var1", "var2", data=df)

这适用于大多数将数组/序列作为输入的绘图方法. data 可以是任何支持 __getitem__ ( dict , pandas.DataFrame , h5py , ...) 以使用字符串键访问 array 样的值的东西.

除此之外,还进行了一些其他的更改,这使得使用带标签的数据(例如 pandas.Series )更加容易:

  • 对于具有 label 关键字参数的绘图方法,其中一个数据输入被指定为标签源.如果用户没有提供 label ,则将内省该值对象以查找标签,目前通过查找 name 属性.如果该值对象没有 name 属性,但是已指定为 data kwarg 中的键,则使用该键.在上面的例子中,这会在两种情况下都产生一个隐式的 label="var2" .

  • 如果未提供 x 参数,则 plot() 现在使用 Series 的索引而不是 np.arange(len(y)) .

添加了 axes.prop_cycle 键到 rcParams#

这是现在已弃用的 axes.color_cycle 参数的更通用形式.现在,我们不仅可以循环颜色,还可以循环线型,阴影线以及几乎任何其他 artist 属性.循环器表示法用于定义属性循环.将循环器加在一起就像将两个或多个属性循环 zip 在一起:

axes.prop_cycle: cycler('color', 'rgb') + cycler('lw', [1, 2, 3])

你甚至可以乘以循环器,这就像在两个或多个属性循环上使用 itertools.product .

../../_images/sphx_glr_color_cycle_001.png

新的颜色映射#

所有四个被提议作为新的默认颜色映射都可用作 'viridis' (2.0 中的新默认), 'magma' , 'plasma''inferno'

(Source code, png)

样式#

添加了几种新样式,包括来自 Seaborn 项目的许多样式.此外,为了准备即将到来的 2.0 样式更改版本,添加了"classic"和"default"样式.对于此版本,"default"和"classic"样式是相同的.通过现在在你的脚本中使用它们,你可以帮助确保在 matplotlib 的未来升级中平稳过渡,以便你可以在准备好时升级到令人惊叹的新的默认设置!:

import matplotlib.style
matplotlib.style.use('classic')

"default"样式将为你提供 matplotlib 的最新绘图样式:

matplotlib.style.use('default')

后端#

新的后端选择#

环境变量 MPLBACKEND 现在可以用于设置 matplotlib 后端.

wx 后端已更新#

现在 wx 后端可以与 wxPython classic 和 Phoenix 一起使用.

wxPython classic 必须至少是 2.8.12 版本,并且可在 Python 2.x 上运行.截至 2015 年 5 月,wxPython Phoenix 尚未发布正式版本,但当前的快照可在 Python 2.7+ 和 3.4+ 上运行.

如果您安装了多个版本的 wxPython,则用户代码负责设置 wxPython 版本.关于如何执行此操作,请参见示例 嵌入 wx #2 开头的注释.

配置 (rcParams)#

已添加一些参数,其他参数已得到改进.

参数

描述

xaxis.labelpad , yaxis.labelpad

mplot3d 现在遵循这些属性,这些属性默认为 rcParams["axes.labelpad"] (default: 4.0)

rcParams["axes.labelpad"] (default: 4.0)

轴和标签之间的默认空间

rcParams["errorbar.capsize"] (default: 0.0)

误差线上端帽的默认长度

rcParams["xtick.minor.visible"] (default: False) , rcParams["ytick.minor.visible"] (default: False)

次要 x/y 刻度的默认可见性

rcParams["legend.framealpha"] (default: 0.8)

图例框架框的默认透明度

rcParams["legend.facecolor"] (default: 'inherit')

图例框架框的默认 facecolor(或从 rcParams["axes.facecolor"] (default: 'white') "继承")

rcParams["legend.edgecolor"] (default: '0.8')

图例框架框的默认 edgecolor(或从 rcParams["axes.edgecolor"] (default: 'black') "继承")

rcParams["figure.titlesize"] (default: 'large')

图形副标题的默认字体大小

rcParams["figure.titleweight"] (default: 'normal')

图形副标题的默认字体粗细

rcParams["image.composite_image"] (default: True)

在保存时,矢量图形后端是否应将多个图像合成为单个图像.当需要在 Inkscape 或其他程序中进一步编辑文件时很有用.

rcParams["markers.fillstyle"] (default: 'full')

标记的默认填充样式.可能的值为 'full' (默认值), 'left' , 'right' , 'bottom' , 'top''none'

rcParams["toolbar"] (default: 'toolbar2')

添加了 'toolmanager' 作为有效值,从而启用了实验性的 ToolManager 功能.

小部件#

Selectors 的活动状态#

所有选择器现在都实现 set_activeget_active 方法(在访问 active 属性时也会调用)以正确更新和查询它们是否处于活动状态.

ignore , set_activeget_active 方法移动到基类 Widget#

将子类中的重复方法推送到父类,以避免代码重复.

为 MultiCursor 添加启用/禁用功能#

MultiCursor 对象可以在创建后禁用(和启用),而无需销毁该对象.例如:

multi_cursor.active = False

改进的 RectangleSelector 和新的 EllipseSelector Widget#

添加了一个交互式关键字,该关键字在形状绘制完毕后启用可见句柄以操纵形状.

为以下键盘修饰符添加支持:

  • 移动现有形状(默认键 = 'space')

  • 使形状成为正方形(默认 'shift')

  • 使初始点成为形状的中心(默认 'control')

  • 正方形和中心可以组合使用

允许 Artist 在光标中显示像素数据#

向 artists 添加 get_cursor_dataformat_cursor_data 方法,这些方法可用于将 zdata 添加到状态栏中的光标显示中.还添加了 Images 的实现.

新的绘图功能#

自动换行文本#

向 Text 添加了关键字参数"wrap",该参数在绘制时自动中断长文本行.适用于任何旋转文本,不同的对齐模式以及作为标签或标题的文本.这在 Figure ,而不是 Axes 边缘处中断.

(Source code, png)

等高线图角掩蔽#

Ian Thomas 重写了计算等高线的 C++ 代码,以添加对角掩蔽的支持.这由函数 contour()contourf() 中的新关键字参数 corner_mask 控制.先前的行为(现在使用 corner_mask=False 获得)是单个掩蔽点完全掩盖了接触该点的所有四个四边形.使用 corner_mask=True 获得的新行为仅掩盖接触该点的那些四边形的角;包含三个未掩蔽点的任何三角形角都照常绘制等高线.如果未指定 corner_mask 关键字参数,则默认值取自 rcParams.

../../_images/sphx_glr_contour_corner_mask_001.png

Line2D , PatchCollection 的线条样式基本统一#

Lines,Patches 和 Collections 的线条样式处理已统一.现在它们都支持使用短符号(如 "--")以及全名(如 "dashed")定义线条样式.此外,使用虚线模式( (0., [3., 3.]) )的定义也适用于使用 Line2D , PatchCollection 的所有方法.

图例标记顺序#

增加了使用 markerfirst 关键字将标签放置在图例框中标记之前的能力

支持 PolyCollection 和 stackplot 的图例#

legend_handler 添加了 PolyCollection ,并为 stackplot() 添加了 labels 参数.

在 mplot3d quiver 图中支持备用轴心点#

quiver 添加了 pivot kwarg,用于控制箭袋线旋转所围绕的轴心点. 这也决定了箭头沿箭袋线的放置位置.

Logit 尺度#

增加了对 'logit' 轴刻度的支持,这是一种非线性变换

\[x -> \log10(x / (1-x))\]

适用于 0 到 1 之间的排除数据.

向 fill_between 添加 step kwargs#

Axes.fill_between 添加了 step kwarg,以允许填充使用 'step' 绘制样式的线条之间. step 的值与 Axes.stepwhere kwarg 的值匹配. kwargs 名称的不对称性并不理想,但 Axes.fill_between 已经有一个 where kwarg.

这对于绘制预先分箱的直方图特别有用.

方形绘图#

实现了方形绘图功能,作为轴函数中的一个新参数. 当指定参数"square"时,将设置相等的比例,并且设置限制,使得 xmax-xmin == ymax-ymin .

(Source code, png)

更新了 figimage 以采用可选的调整大小参数#

增加了使用 plt.figimage(X, resize=True) 绘制简单 2D 数组的功能. 这对于在图像周围没有轴或空白的情况下绘制简单 2D 数组非常有用.

(Source code, png)

更新了 Figure.savefig() 现在可以使用 figure 的 dpi#

增加了使用与屏幕上图形相同的 dpi 保存图形的支持,使用 dpi='figure' :.

例子:

f = plt.figure(dpi=25)  # dpi set to 25
S = plt.scatter([1,2,3],[4,5,6])
f.savefig('output.png', dpi='figure')  # output savefig dpi set to 25 (same as figure)

更新了 Table 以控制边缘可见性#

增加了切换表格中线条可见性的功能. 功能已添加到关键字参数"edges"下的 pyplot.table 工厂函数中. 值可以是字符串"open","closed","horizontal","vertical"或字母"L","R","T","B"的组合,分别代表左,右,上和下.

例子:

table(..., edges="open")  # No line visible
table(..., edges="closed")  # All lines visible
table(..., edges="horizontal")  # Only top and bottom lines visible
table(..., edges="LT")  # Only left and top lines visible.

在 plot_wireframe 中支持零 r/cstride#

Adam Hughes 在 mplot3d 的 plot_wireframe 中添加了仅绘制行或列线图的支持.

(Source code, png)

使用标签绘制 bar 和 barh#

barbarh 添加了 kwarg tick_label,以支持绘制带有每个条形文本标签的条形图.

(Source code, png)

向饼图添加了 center 和 frame kwargs#

它们控制饼图的中心位置以及是否显示 Axes 框架.

修复了 3D 填充轮廓图多边形渲染#

由于 PolyCollectionPoly3DCollection 之间路径信息的丢失,某些生成具有多个孔的多边形的 3D 填充轮廓图的情况产生了不正确的渲染.添加了函数 set_verts_and_codes() ,以允许保留路径信息以进行正确的渲染.

密集颜色条被栅格化#

矢量文件格式(pdf,ps,svg)对于许多类型的绘图元素来说都很高效,但对于某些元素来说,它们可能会产生过大的文件大小,甚至导致渲染伪影,具体取决于用于屏幕显示的渲染器.对于显示大量阴影的颜色条来说,这是一个问题,这种情况很常见.现在,如果颜色条显示 50 种或更多颜色,它将在矢量后端中栅格化.

DateFormatter strftime#

DateFormatter__call__ 方法将使用传递给格式化程序构造函数的格式字符串来格式化 datetime.datetime 对象.与 datetime.datetime.strftime() 不同,此方法接受年份早于 1900 年的日期时间.

文本的 Artist 级别 {get,set}_usetex#

Text 对象添加 {get,set}_usetex 方法,这些方法允许对 LaTeX 渲染与内部 mathtex 渲染进行 Artist 级别的控制.

Axes.remove() 按预期工作#

与添加到 Axes 的 artist 一样,可以通过 remove() 从其 figure 中删除 Axes 对象.

修复了 Locators set_params() 函数中的 API 一致性#

set_params() 函数,它设置 Locator 类型实例中的参数,现在可用于所有 .Locator 类型.该实现还通过严格定义用户可以设置的参数来防止不安全的使用.

要使用,请使用所需的参数在 .Locator 实例上调用 set_params() :

loc = matplotlib.ticker.LogLocator()
# Set given attributes for loc.
loc.set_params(numticks=8, numdecs=8, subs=[2.0], base=8)
# The below will error, as there is no such parameter for LogLocator
# named foo
# loc.set_params(foo='bar')

Date Locators#

Date Locators(派生自 DateLocator )现在实现了 tick_values 方法.这是所有派生自 Locator 的 Locators 所期望的.

现在可以轻松使用 Date Locators,而无需创建坐标轴

from datetime import datetime
from matplotlib.dates import YearLocator
t0 = datetime(2002, 10, 9, 12, 10)
tf = datetime(2005, 10, 9, 12, 15)
loc = YearLocator()
values = loc.tick_values(t0, tf)

OffsetBoxes 现在支持剪裁#

.Artist s 通过 DrawingAreaTextArea 绘制到 OffsetBox 类型的对象上. .TextArea 计算文本所需的空间,因此文本始终在边界内,对于此,没有任何改变.

但是, .DrawingArea 充当零个或多个绘制在其上的 .Artist s 的父级,并且可能超出边界进行绘制.现在,子 .Artist s 可以被剪裁到 .DrawingArea 的边界.

tight_layout 现在考虑 OffsetBoxes#

当调用 tight_layout()Figure.tight_layoutGridSpec.tight_layout() 时,锚定在坐标轴之外的 .OffsetBox es 将不会被裁剪掉.在多个子图的情况下, .OffsetBox es 也不会被其他坐标轴重叠.

多页 pdf 中的每页 pdf 注释 (PdfPages)#

向 PdfPages 类添加一个新方法 attach_note() ,允许将简单的文本注释附加到 figures 的多页 pdf 中的页面.新的注释在具有此功能的查看器(Adobe Reader,OSX Preview,Skim 等)的 pdf 注释列表中可见.默认情况下,注释本身会保留在页面外,以防止它出现在打印输出中.

PdfPages.attach_note 需要在 savefig 之前调用,以便添加到正确的 figure.

更新 fignum_exists 以获取 figure 名称#

添加了使用 figure 名称而不是仅使用 figure 编号来检查 figure 是否存在的功能. 示例:

figure('figure')
fignum_exists('figure') #true

ToolManager#

Federico Ariza 编写了新的 ToolManager ,它是 NavigationToolbar2 的替代品

.ToolManager 提供了一种新的方式来看待用户与 figures 的交互. 在此之前,我们有带有自己的工具的 NavigationToolbar2 ,例如 zoom/pan/home/save/... ,并且我们还有快捷方式,例如 yscale/grid/quit/.... . .ToolManager 将所有这些操作重新定位为工具(位于 backend_tools 中),并定义了一种访问/触发/重新配置它们的方式.

工具栏被 ToolContainerBase 替换,它们只是触发工具的 GUI 界面.但不用担心,默认后端包含一个名为 toolbarToolContainerBase .

备注

目前,我们发布此版本主要用于收集反馈,在另行通知之前,应将其视为实验性版本,因为 API 可能会发生更改.目前, ToolManager 仅适用于 GTK3 和 Tk 后端.请确保您使用其中一个.其余后端的端口即将推出.

要激活 ToolManager ,请在文件顶部包含以下内容

>>> matplotlib.rcParams['toolbar'] = 'toolmanager'

与 ToolContainer 交互#

最重要的功能是能够轻松地重新配置 ToolContainer(又名工具栏).例如,如果我们想删除"前进"按钮,我们可以这样做

>>> fig.canvas.manager.toolmanager.remove_tool('forward')

现在,如果您想以编程方式触发"主页"按钮

>>> fig.canvas.manager.toolmanager.trigger_tool('home')

ToolManager 的新工具#

可以向 ToolManager 添加新工具

一个非常简单的工具,可以打印"You're awesome",如下所示

from matplotlib.backend_tools import ToolBase
class AwesomeTool(ToolBase):
    def trigger(self, *args, **kwargs):
        print("You're awesome")

要将此工具添加到 ToolManager

>>> fig.canvas.manager.toolmanager.add_tool('Awesome', AwesomeTool)

如果我们想为该工具添加快捷方式("d")

>>> fig.canvas.manager.toolmanager.update_keymap('Awesome', 'd')

要将其添加到组"foo"内的工具栏中

>>> fig.canvas.manager.toolbar.add_tool('Awesome', 'foo')

还有第二类工具,"可切换工具",它们与我们的基本工具几乎相同,只是属于一个组,并且在该组内是互斥的.对于从 ToolToggleBase 派生的工具,有两个基本方法 enabledisable ,它们在切换时自动调用.

一个完整的示例位于 工具管理器

cbook.is_sequence_of_strings 识别字符串对象#

这主要是 pandas 存储字符串序列的方式

import pandas as pd
import matplotlib.cbook as cbook

a = np.array(['a', 'b', 'c'])
print(cbook.is_sequence_of_strings(a))  # True

a = np.array(['a', 'b', 'c'], dtype=object)
print(cbook.is_sequence_of_strings(a))  # True

s = pd.Series(['a', 'b', 'c'])
print(cbook.is_sequence_of_strings(s))  # True

以前,最后两次打印返回 false.

绘图指令的新 close-figs 参数#

Matplotlib 有一个 sphinx 扩展 plot_directive ,用于创建绘图以包含在 sphinx 文档中.Matplotlib 1.5 向 plot 指令添加了一个新选项 - close-figs - 它在创建绘图之前关闭任何先前的图形窗口.这可以帮助避免在使用 plot_directive 时出现一些令人惊讶的绘图重复.

支持 URL 字符串参数到 imread#

imread() 函数现在接受指向远程 PNG 文件的 URL 字符串.这避免了直接生成 HTTPResponse 对象.

IPython notebook 中动画的显示钩子#

Animation 实例获得了一个 _repr_html_ 方法,以支持在 notebook 中内联显示动画.用于显示的方法由 animation.html rc 参数控制,该参数当前支持 nonehtml5 值. none 是默认值,不执行任何显示. html5 将动画转换为 h264 编码的视频,该视频直接嵌入 notebook 中.

不希望使用 _repr_html_ 显示钩子的用户也可以手动调用 to_html5_video 方法来获取 HTML 并使用 IPython 的 HTML 显示类进行显示

from IPython.display import HTML
HTML(anim.to_html5_video())

用于构建的带有前缀的 pkg-config#

pkg-config 的处理已得到修复,因为现在可以使用环境变量 PKG_CONFIG 来设置它.如果您的工具链带有前缀,这一点很重要.这与在构建之前设置 CCCXX 的方式类似.下面是一个例子

export PKG_CONFIG=x86_64-pc-linux-gnu-pkg-config