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

备注

matplotlib 1.5 支持 Python 2.7、3.4 和 3.5

交互式 OO 使用#

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

为了便于交互使用,pyplot 中添加了 draw_all 方法,该方法将重新绘制所有 '过时' 的图形。

为了便于交互使用,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 的 DataFrame#

接受数组作为输入的绘图方法现在也可以处理带标签的数据并解包此类数据。

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

示例

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 等),以便通过字符串键访问类似数组的值。

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

  • 对于带有 label 关键字参数的绘图方法,其中一个数据输入被指定为标签源。如果用户没有提供 label,该值对象将被内省以查找标签,目前是通过查找 name 属性。如果值对象没有 name 属性,但被指定为 data 关键字参数的键,则使用该键。在上面的示例中,这导致在两种情况下都隐含了 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'

(Source code, 2x.png, 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)#

一些参数已经添加,其他参数已经改进。

参数

描述

rcParams["xaxis.labelpad"], rcParams["yaxis.labelpad"]

mplot3d 现在遵循这些参数

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')

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

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

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

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["工具栏"]

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

小部件#

选择器的活动状态#

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

ignoreset_activeget_active 方法移至基类 Widget#

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

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

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

multi_cursor.active = False

改进的 RectangleSelector 和新 EllipseSelector 小部件#

添加一个 交互式 关键字,该关键字在形状绘制后启用用于操作形状的可视化手柄。

添加键盘修饰符用于:

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

  • 将形状设为方形(默认值为 'shift')

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

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

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

向艺术家添加 get_cursor_dataformat_cursor_data 方法,这些方法可用于在状态栏的光标显示中添加 zdata。同时为图像添加了一个实现。

新的绘图功能#

自动换行文本#

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

(Source code, 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

主要统一了 Line2DPatchCollection 的线条样式#

线条样式处理已统一应用于线条、补丁和集合。现在它们都支持使用短符号(如“--”)以及全名(如“dashed”)来定义线条样式。此外,使用破折号模式((0., [3., 3.]))的定义也支持所有使用`.Line2D`、Patch`或.Collection`的方法。

图例标记顺序#

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

支持为 PolyCollection 和 stackplot 添加图例#

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

mplot3d 箭袋图中的备用枢轴支持#

quiver 添加了一个 pivot 关键字参数,用于控制箭头围绕其旋转的支点。这还决定了箭头头沿箭头线的位置。

Logit 尺度#

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

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

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

添加步骤 kwargs 到 fill_between#

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

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

方形图#

在轴函数中实现了方形绘图功能作为新参数。当指定参数 'square' 时,设置等比例缩放,并且设置限制使得 xmax-xmin == ymax-ymin

(Source code, 2x.png, png)

更新了 figimage,使其接受可选的 resize 参数#

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

(Source code, 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 添加了支持,使其可以仅绘制行或列的线图。

(Source code, 2x.png, png)

绘制带有标签的条形图和水平条形图#

barbarh 添加了 tick_label 关键字参数,以支持为每个条形图绘制带有文本标签的条形图。

(Source code, 2x.png, png)

为饼图添加了 center 和 frame 关键字参数#

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

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

在某些情况下,3D填充等高线图生成的多孔多边形由于在 PolyCollectionPoly3DCollection 之间丢失了路径信息而导致渲染不正确。添加了一个函数 set_verts_and_codes(),以允许保留路径信息以进行正确的渲染。

密集的颜色条是光栅化的#

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

DateFormatter strftime#

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

艺术家级别的 {get,set}_usetex 用于文本#

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

Axes.remove() 按预期工作#

与添加到 Axes 的艺术家一样,Axes 对象可以通过 remove() 从其图形中移除。

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

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 现在支持裁剪#

Artists 通过 DrawingAreaTextAreaOffsetBox 类型的对象上绘制。TextArea 计算文本所需的空间,因此文本始终在边界内,对此没有任何改变。

然而,DrawingArea 作为零个或多个在其上绘制的 Artist 的父级,可能会超出边界进行绘制。现在,子 Artist 可以被裁剪到 DrawingArea 的边界内。

OffsetBoxes 现在被 tight_layout 考虑#

当调用 tight_layout()Figure.tight_layoutGridSpec.tight_layout() 时,锚定在坐标轴外部的 OffsetBox 不会被裁剪掉。在多子图的情况下,OffsetBox 也不会被其他坐标轴覆盖。

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

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

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

更新了 fignum_exists 以接受图形名称#

增加了通过名称而不是仅通过编号来检查图形存在性的功能。例如:

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

工具管理器#

Federico Ariza 编写了新的 ToolManager,它作为 NavigationToolbar2 的替代品出现。

ToolManager 提供了一种新的方式来处理用户与图形之间的交互。在此之前,我们有 NavigationToolbar2 及其自带的工具,如 缩放/平移/主页/保存/...,还有快捷键,如 y轴比例/网格/退出/....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