如何

如何:打印

情节 numpy.datetime64 价值观

从Matplotlib 2.2开始, numpy.datetime64 对象的处理方式与 datetime.datetime 物体。

如果你喜欢熊猫转换器和定位器,你可以注册它们。这是在调用pandas plot函数时自动完成的,在直接使用pandas而不是Matplotlib时可能不需要这样做。:

from pandas.plotting import register_matplotlib_converters
register_matplotlib_converters()

检查图形是否为空

空实际上意味着不同的东西。这幅画里有艺术家吗?有空的图形 Axes 还算空吗?如果是纯白色的,图形是否为空(可能有艺术家在场,但他们可能在绘图区域之外或是透明的)?

为了达到这个目的,我们将空定义为:“除了背景补丁之外,这个图形不包含任何艺术家。”背景的例外是必要的,因为默认情况下每个图形都包含一个 Rectangle 因为它是背景补丁。可通过以下方式检查此定义:

def is_empty(figure):
    """
    Return whether the figure contains no Artists (other than the default
    background patch).
    """
    contained_artists = figure.get_children()
    return len(contained_artists) <= 1

我们决定不把它作为一个figure方法来包含,因为这只是定义空的一种方法,而且很少需要检查上面的内容。通常处理图形的用户或程序知道他们是否向图形添加了一些内容。

除非通过实际呈现图形并调查渲染结果,否则无法可靠地检查地物是否呈现为空。

查找某一类型图形中的所有对象

每个Matplotlib艺术家(参见 艺术家辅导 )有一个方法调用 findobj() 可用于递归搜索艺术家的任何艺术家,其中可能包含符合某些条件的艺术家(例如,全部匹配 Line2D 实例或匹配某些任意筛选函数)。例如,下面的代码段将查找图中具有 set_color 属性并使对象变为蓝色:

def myfunc(x):
    return hasattr(x, 'set_color')

for o in fig.findobj(myfunc):
    o.set_color('blue')

您还可以对类实例进行筛选:

import matplotlib.text as text
for o in fig.findobj(text.Text):
    o.set_fontstyle('italic')

如何防止滴答标签有偏移

默认格式设置工具将使用偏移量来缩短刻度线标签的长度。要按轴关闭此功能,请执行以下操作:

ax.get_xaxis().get_major_formatter().set_useOffset(False)

设置 rcParams["axes.formatter.useoffset"] (default: True) 或者使用其他格式化程序。见 ticker 有关详细信息。

保存透明数字

这个 savefig() 命令有关键字参数 透明的 如果为“真”,则保存时将使图形和轴背景透明,但不会影响屏幕上显示的图像。

如果您需要更细粒度的控制,例如,您不希望完全透明,或者您也希望影响屏幕显示的版本,您可以直接设置alpha属性。这个数字有一个 Rectangle 实例称为 补丁 轴有一个矩形实例,名为 补丁 . 您可以直接对它们设置任何属性( 脸色变色染料线宽线型阿尔法 )例如。::

fig = plt.figure()
fig.patch.set_alpha(0.5)
ax = fig.add_subplot(111)
ax.patch.set_alpha(0.5)

如果你需要 all 图形元素是透明的,当前没有全局alpha设置,但可以在单个元素上设置alpha通道,例如:

ax.plot(x, y, alpha=0.5)
ax.set_xlabel('volts', alpha=0.5)

将多个绘图保存到一个PDF文件中

许多图像文件格式每个文件只能有一个图像,但有些格式支持多页文件。目前只有PDF后端支持此功能。要制作多页PDF文件,请首先初始化该文件:

from matplotlib.backends.backend_pdf import PdfPages
pp = PdfPages('multipage.pdf')

你可以给 PdfPages 对象到 savefig() ,但必须指定格式::

plt.savefig(pp, format='pdf')

更简单的方法是打电话 PdfPages.savefig ::

pp.savefig()

最后,必须关闭multipage pdf对象:

pp.close()

使用pgf后端也可以做到这一点:

from matplotlib.backends.backend_pgf import PdfPages

移动轴的边缘,为刻度标签留出空间

对于子批次,可以使用 matplotlib.figure.Figure.subplots_adjust() 方法(在Pyplot中 subplots_adjust() )例如,要向上移动子批次的底部,以便为某些旋转的X记号标签腾出空间,请执行以下操作:

fig = plt.figure()
fig.subplots_adjust(bottom=0.2)
ax = fig.add_subplot(111)

您可以在 matplotlibrc 文件;参见 使用样式表和RCPARAM自定义Matplotlib . 例如,要使上述设置永久化,您可以设置:

figure.subplot.bottom : 0.2   # the bottom of the subplots of the figure

您可以配置的其他参数包括其默认值

left = 0.125
图的子图的左侧
正确的 = 0.9
图子图的右侧
底部 = 0.1
数字子图的底部
top = 0.9
数字子图的顶部
WSPACE = 0.2
为子块之间的空间保留的宽度量,表示为平均轴宽度的分数。
水平间距 = 0.2
为子批次之间的空间保留的高度量,表示为平均轴高度的分数。

如果需要其他控件,可以创建 Axes 使用 axes() 命令(或等同于数字 add_axes() 方法),它允许您显式指定位置:

ax = fig.add_axes([left, bottom, width, height])

其中所有值都是分数(0到1)坐标。见 轴演示 例如手动放置轴。

自动为刻度线标签留出空间

注解

这比以往任何时候都更容易处理。打电话 tight_layout() 或者使用 constrained_layout=True 论点 subplots() 可以修复许多常见的布局问题。见 紧密布局指南受约束的布局参考线 了解更多详细信息。

以下信息保存在这里,以备其他用途使用。

在大多数用例中,只需更改子块调整参数就足够了,如中所述 移动轴的边缘,为刻度标签留出空间 . 但在某些情况下,您不知道刻度线标签将是什么,或者它们将有多大(您控制之外的数据和标签可能被送入图形应用程序),您可能需要根据刻度线标签的大小自动调整子批次参数。任何 Text 实例可以在窗口坐标中报告其范围(窗口外有负x坐标),但存在摩擦。

这个 RendererBase 用于计算文本大小的实例在绘制图形之前是未知的 (draw() )在绘制窗口并且文本实例知道其渲染器之后,可以调用 get_window_extent() . 解决这个鸡和蛋问题的一种方法是等待通过连接绘制出数字。 (mpl_connect() )到“开-拉”信号 (DrawEvent )然后将窗口范围移到那里,然后对其执行一些操作,例如,将画布的左侧移到上面;请参见 事件处理和挑选 .

下面是一个示例,它在每个标签的相对图形坐标(0..1)中获取一个边界框,并使用该边界框将子批次的左侧移过,以便勾号标签适合该图:

../_images/sphx_glr_auto_subplots_adjust_001.png

自动子批次调整

配置刻度宽度

如果可能,建议使用 tick_params()set_tick_params() 修改刻度属性的方法:

import matplotlib.pyplot as plt

fig, ax = plt.subplots()
ax.plot(range(10))

ax.tick_params(width=10)

plt.show()

对于以上方法未提供的Tick属性的更多控制,重要的是要知道在Matplotlib中,Ticks是 标记 . 所有 Line2D 对象支持线条(实线、虚线等)和标记(圆、正方形、勾号)。刻度线宽度由 "markeredgewidth" 属性,因此上述效果也可以通过以下方式实现:

import matplotlib.pyplot as plt

fig, ax = plt.subplots()
ax.plot(range(10))

for line in ax.get_xticklines() + ax.get_yticklines():
    line.set_markeredgewidth(10)

plt.show()

控制刻度线标记和所有标记的其他属性是 markerfacecolormarkeredgecolormarkeredgewidthmarkersize . 有关配置刻度的详细信息,请参阅 轴容器滴答容器 .

在多个子批次之间对齐我的ylabels

如果有多个子地块,而Y数据具有不同的比例,则通常可以得到不在多个子地块上垂直对齐的伊拉贝尔,这可能不具有吸引力。默认情况下,matplotlib会定位ylabel的X位置,这样它就不会与任何Y记号重叠。可以通过指定标签的坐标来覆盖此默认行为。下面的示例显示了左侧子批次中的默认行为,以及右侧子批次中的手动设置。

../_images/sphx_glr_align_ylabels_001.png

对齐标签

跳过没有数据的日期

在绘制时间序列(例如金融时间序列)时,人们通常希望省略没有数据的日子,例如周末。通过在x-x轴上传递日期,可以在没有数据的时段上获得较大的水平间隙。解决方案是传入一些代理x数据,例如均匀采样的索引,然后使用自定义格式化程序将其格式化为日期。 时间序列的自定义刻度格式设置工具 演示如何使用“索引格式化程序”实现所需的绘图。

控制绘图元素的深度

在一个轴中,各种行、标记、文本、集合等的显示顺序由 set_zorder() 财产。默认顺序是Patches、Lines、Text,其中行集合和修补程序集合分别显示在与常规行和修补程序相同的级别上:

line, = ax.plot(x, y, zorder=10)

Zorder演示 举一个完整的例子。

也可以使用“轴”属性 set_axisbelow() 控制网格线是放置在其他绘图元素的上方还是下方。

使绘图的纵横比相等

axes属性 set_aspect() 控制轴的纵横比。您可以将其设置为“自动”、“相等”或控制比率的某个比率:

ax = fig.add_subplot(111, aspect='equal')

轴相等演示 举一个完整的例子。

多个Y轴比例

一个常见的要求是左右Y轴有两个刻度,可以使用 twinx() (目前不支持两个以上的等级,尽管它在心愿单上)。这很好地工作,尽管当你试图交互地平移和缩放时有一些奇怪的地方,因为两个比例都没有得到信号。

该方法使用 twinx() 和它的姐妹 twiny() )使用 两个不同的轴 ,关闭第二个轴上的轴矩形框以防止第一个轴模糊,并根据需要手动设置刻度线位置和标签。你可以单独使用 matplotlib.ticker 由于这两个轴是独立的,因此可以根据需要设置格式化程序和定位器。

(Source code _, pngpdf

../_images/howto_faq-1.png

不同比例尺的图 举一个完整的例子。

生成图像而不显示窗口

只是不要打电话 show ,并直接将图形保存为所需格式:

import matplotlib.pyplot as plt
plt.plot([1, 2, 3])
plt.savefig('myfig.png')

参见

如何在web应用服务器中使用Matplotlib 有关在Web应用程序内部运行matplotlib的信息。

使用 show()

当您想在显示器上查看您的绘图时,用户界面后端将需要启动GUI主循环。这是什么 show() 做。它告诉matplotlib提升到目前为止创建的所有图形窗口并启动主循环。因为这个主循环在默认情况下是阻塞的(即,脚本执行被暂停),所以您应该在结束时对每个脚本只调用一次。关闭最后一个窗口后,将继续执行脚本。因此,如果使用matplotlib只生成图像,不需要用户界面窗口,则不需要调用 show (见 生成图像而不显示窗口什么是后端?

注解

Because closing a figure window unregisters it from pyplot, you must call savefig before calling show if you wish to save the figure as well as view it.

是否 show 阻止脚本或python解释器的进一步执行取决于Matplotlib是否设置为使用交互模式。在非交互模式(默认设置)下,将暂停执行,直到关闭最后一个地物窗口。在交互模式下,执行不会暂停,这允许您创建额外的图形(但在关闭最后一个图形窗口之前,脚本不会完成)。

因为绘制成本很高,所以通常不希望matplotlib在脚本中多次重新绘制图形,例如:

plot([1, 2, 3])          # draw here?
xlabel('time')           # and here?
ylabel('volts')          # and here?
title('a simple plot')   # and here?
show()

然而,它是 可能的 强制matplotlib在每个命令后绘制,这可能是在Python控制台交互工作时需要的(请参见 交互式图形 ,但在脚本中,您希望将所有绘图延迟到调用 show . 这对于需要一段时间绘制的复杂图形尤其重要。 show() 旨在告诉Matplotlib,您已经完成了发出命令,现在您想要绘制图形。

注解

show() 通常每个脚本最多只能调用一次,它应该是脚本的最后一行。此时,GUI控制解释器。如果要强制绘制图形,请使用 draw() 相反。

v1.0.0 新版功能: 添加了对plot1.0.0和matlib.0.0的调用支持 show 每个脚本多次,并协调交互模式的行为,跨大多数后端。

解读盒图和小提琴图

图基 box plots (Robert McGill、John W.Tukey和Wayne A.Larsen:“美国统计学家”第32卷,第1期,1978年2月,第12-16页)是提供有关数据分布的有用信息的统计图,如偏态。然而,在大多数科学文献中,带误差条的条形图仍然是常见的标准,因此,对不熟悉的读者来说,对方框图的解释可能是一个挑战。下图说明了方框图的不同视觉特征。

../_images/boxplot_explanation.png

Violin plots 与盒形图密切相关,但添加了有用的信息,如样本数据的分布(密度跟踪)。在matplotlib1.4中添加了小提琴情节。

使用线程

Matplotlib不是线程安全的:事实上,已知的竞争条件会影响某些艺术家。因此,如果您使用线程,则您有责任设置适当的锁来序列化对Matplotlib艺术家的访问。

你可以用不同的线程来处理不同的图形。但是,在这种情况下,必须使用 non-interactive backend (通常是Agg),因为大多数GUI后端 要求 也从主线程运行。

如何:贡献

请求新功能

你希望Matplotlib有什么特色吗?然后问!最好的开始方法是向开发人员发送电子邮件 mailing list 供讨论。这是一个开源项目,主要是在贡献者空闲时间开发的,因此不能保证您的特性会被添加。这个 best 获得你需要添加的功能的方法就是自己贡献它。

报告错误或提交修补程序

Matplotlib的开发是通过 github . 如果要报告错误或提交补丁,请使用该接口。

报告错误 create an issue 在GitHub上(这需要有GitHub帐户)。请包括一个 Short, Self Contained, Correct (Compilable), Example 演示错误是什么。包括一个清晰的、易于测试的示例,使开发人员很容易评估这个bug。希望bug报告是一个对话。如果您不想在GitHub注册,请通过电子邮件将错误报告发送至 mailing list .

向matplotlib提交补丁的最简单方法是通过github上的请求。请看 Matplotlib开发者指南 有关详细信息。

参与Matplotlib文档

Matplotlib是一个很大的库,有很多种用途,文档只触及了它所能做的一切的表面。到目前为止,大多数人都是通过研究 绘图示例 ,这是一个推荐的很好的学习方法,但如果有更多的官方叙事文档来指导人们度过所有的黑暗角落,那就太好了。这就是你进来的地方。

您很有可能比编写大部分文档的许多核心开发人员更了解Matplotlib在某些领域的用法,即您每天所做的事情。你刚刚在为Windows编译Matplotlib而烦恼吗?为 安装 页。您是数字信号处理向导吗?编写信号分析绘图功能的教程,如 xcorr()psd()specgram() . 你用Matplotlib和 django 或者其他流行的Web应用服务器?编写一个常见问题解答或教程,我们将在 用户指南 . 等等。。。我想你明白了。

Matplotlib使用 sphinx 重新构造文本的扩展 (ReST) . sphinx是一个可扩展的python框架,用于生成HTML和PDF的文档项目,并且非常容易编写;通过单击 显示源 在侧边栏的页面末尾链接。

Sphinx 网站是学习 Sphinx 的好资源,但我们在 编写文档 它向您展示了如何开始,并概述了matplotlib约定和扩展,例如,在文档中直接包含来自外部代码的绘图。

一旦您的文档贡献起作用(并希望通过实际测试 建筑 这些文档)您可以将它们作为针对Git的补丁提交。见 安装GIT报告错误或提交修补程序 . 想找点事做吗?寻找 TODO 或者看看Github上的未解决问题。

如何在web应用服务器中使用Matplotlib

一般来说,在web服务器中使用Matplotlib时,最简单的解决方案是完全避免使用pyplot(pyplot维护对打开的图形的引用来生成) show 工作,但这将导致内存泄漏,除非数字被正确关闭)。从matplotlib3.1开始,可以使用 Figure 构造函数并将它们保存到内存缓冲区。以下示例使用 Flask, 但其他框架的工作原理类似:

import base64
from io import BytesIO

from flask import Flask
from matplotlib.figure import Figure

app = Flask(__name__)

@app.route("/")
def hello():
   # Generate the figure **without using pyplot**.
   fig = Figure()
   ax = fig.subplots()
   ax.plot([1, 2])
   # Save it to a temporary buffer.
   buf = BytesIO()
   fig.savefig(buf, format="png")
   # Embed the result in the html output.
   data = base64.b64encode(buf.getbuffer()).decode("ascii")
   return f"<img src='data:image/png;base64,{data}'/>"

使用早于3.1的Matplotlib版本时,需要显式地实例化一个Agg画布;参见。 卡纳瓦格演示 .

HTML的可单击图像

Andrew Dalke Dalke Scientific 写了一篇很好的 article 关于如何制作HTML,请单击带有matplotlib agg pngs的地图。我们还想将此功能添加到SVG中。如果你有兴趣为这些努力做出贡献,那就太好了。