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

注意

matplotlib 1.5 支持 Python 2.7、3.4 和 3.5

交互式 OO 用法#

现在,所有的 Artist 都会跟踪它们的内部状态是否已更改但未反映在显示中(“陈旧”),这通过调用 draw 来实现。因此,可以务实地确定是否需要在交互式会话中重新绘制给定的 Figure

为了方便交互式使用,已将 draw_all 方法添加到 pyplot,这将重新绘制所有“陈旧”的图形。

为了方便交互式使用,matplotlib 现在注册了一个函数,该函数要么使用 IPython 的“post_execute”事件,要么使用标准 python REPL 中的 displayhook,以在控制权返回给 REPL 之前自动调用 plt.draw_all。这确保了绘图命令被延迟,并且只调用一次。

这样做的结果是,对于交互式模式下的交互式后端(包括 %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__ 的东西(dictpandas.DataFrameh5py 等),以便使用字符串键访问类似 array 的值。

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

  • 对于带有 label 关键字参数的绘图方法,其中一个数据输入被指定为标签源。如果用户没有提供 label,则会检查该值对象以查找标签,当前是通过查找 name 属性。如果值对象没有 name 属性,但已指定为 data kwarg 中的键,则使用该键。在上面的示例中,这导致两个案例都隐式地使用 label="var2"

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

在 rcParams 中添加 axes.prop_cycle#

这是现在已弃用的 axes.color_cycle 参数的更通用形式。现在,我们不仅可以循环颜色,还可以循环线型、阴影以及几乎任何其他艺术家属性。循环器表示法用于定义属性循环。将循环器加在一起就像将两个或多个属性循环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'

源代码2x.pngpng

样式#

添加了几个新样式,包括来自 Seaborn 项目的许多样式。此外,为了准备即将到来的 2.0 样式更改版本,添加了“经典”和“默认”样式。对于此版本,“默认”和“经典”样式是相同的。通过现在在脚本中使用它们,您可以帮助确保在 matplotlib 的未来升级期间平稳过渡,以便您可以在准备就绪时升级到时髦的新默认值!

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

“默认”样式将为您提供 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.labelpadyaxis.labelpad

mplot3d 现在尊重这些属性,这些属性默认为 rcParams["axes.labelpad"] (默认值:4.0

rcParams["axes.labelpad"] (默认值:4.0

轴和标签之间的默认空间

rcParams["errorbar.capsize"] (默认值:0.0

误差条上端盖的默认长度

rcParams["xtick.minor.visible"] (默认值:False),rcParams["ytick.minor.visible"] (默认值:False

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

rcParams["legend.framealpha"] (默认值:0.8

图例框架框的默认透明度

rcParams["legend.facecolor"] (默认值:'inherit'

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

rcParams["legend.edgecolor"] (默认值:'0.8'

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

rcParams["figure.titlesize"] (默认值:'large'

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

rcParams["figure.titleweight"] (默认值:'normal'

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

rcParams["image.composite_image"] (默认值:True

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

rcParams["markers.fillstyle"] (默认值:'full'

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

rcParams["toolbar"] (默认值:'toolbar2'

添加 'toolmanager' 作为有效值,启用实验性的 ToolManager 功能。

小部件#

选择器的活动状态#

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

ignoreset_activeget_active 方法移动到基类 Widget#

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

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

MultiCursor 对象可以在创建后禁用(和启用),而不会销毁该对象。示例

multi_cursor.active = False

改进的 RectangleSelector 和新的 EllipseSelector 小部件#

添加一个 *interactive* 关键字,该关键字允许在绘制形状后使用可见的手柄来操纵形状。

添加以下键盘修饰符:

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

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

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

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

允许艺术家在光标中显示像素数据#

为艺术家添加了 get_cursor_dataformat_cursor_data 方法,这些方法可用于将 zdata 添加到状态栏中的光标显示。 还为图像添加了实现。

新的绘图功能#

自动换行文本#

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

(源代码, 2x.png, 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”)定义线型。此外,对于所有使用 Line2DPatchCollection 的方法,都支持使用虚线模式((0., [3., 3.]))进行定义。

图例标记顺序#

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

支持 PolyCollection 和 stackplot 的图例#

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

支持 mplot3d 箭袋图中备用轴心#

quiver 添加了一个 pivot kwarg,用于控制箭袋线围绕其旋转的轴心点。这还决定了箭头沿箭袋线的位置。

Logit 比例#

添加了对 'logit' 轴比例的支持,这是一种非线性转换

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

对于 0 到 1 之间(不包括 0 和 1)的数据。

向 fill_between 添加 step kwargs#

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

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

正方形绘图#

将正方形绘图功能实现为轴函数中的一个新参数。当指定参数 'square' 时,将设置相等的缩放比例,并将限制设置为使 xmax-xmin == ymax-ymin

(源代码, 2x.png, png)

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

添加了使用 plt.figimage(X, resize=True) 绘制简单 2D 数组的功能。这对于绘制简单的 2D 数组,而无需坐标轴或图像周围的空白非常有用。

(源代码, 2x.png, png)

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

添加了使用 dpi='figure' 以与屏幕上的图形相同的 dpi 保存图形的支持:。

示例

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)

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

添加了切换表中线条可见性的功能。功能已添加到 pyplot.table 工厂函数中,该函数位于关键字参数 "edges" 下。值可以是字符串“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 的支持,以仅绘制行或列线图。

(源代码, 2x.png, png)

使用标签绘制条形图和条形图h#

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

(源代码, 2x.png, png)

为饼图添加了 center 和 frame kwargs#

这些控制饼图的中心位置以及是否显示坐标轴框架。

修复了 3D 填充等高线图多边形渲染#

某些情况下,产生具有多个孔洞的 3D 填充轮廓图会因 PolyCollectionPoly3DCollection 之间路径信息的丢失而导致渲染不正确。添加了函数 set_verts_and_codes() 以允许保留路径信息以便正确渲染。

密集的颜色条被栅格化#

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

DateFormatter strftime#

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

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

Text 对象添加 {get,set}_usetex 方法,允许艺术家级别控制 LaTeX 渲染与内部 mathtex 渲染。

Axes.remove() 按预期工作#

与添加到 Axes 的艺术家一样,可以通过 remove() 从其图形中删除 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')

日期定位器#

日期定位器(派生自 DateLocator)现在实现了 tick_values 方法。这是所有派生自 Locator 的定位器所期望的。

现在可以轻松使用日期定位器,而无需创建轴

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 通过 DrawingAreaTextArea 绘制到 OffsetBox 类型的对象上。TextArea 计算文本所需的空间,因此文本始终在边界内,对此没有任何改变。

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

tight_layout 现在考虑 OffsetBoxes#

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

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

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

必须在 savefig 之前调用 PdfPages.attach_note,以便将其添加到正确的图形中。

更新 fignum_exists 以接受图形名称#

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

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

ToolManager#

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

ToolManager 提供了一种新的方式来查看用户与图形的交互。之前我们有 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。

plot 指令的新 close-figs 参数#

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

支持 imread 的 URL 字符串参数#

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

IPython 笔记本中动画的显示挂钩#

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

不希望使用 _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