如何将 pyplot 函数附加到图形实例?

Posted

技术标签:

【中文标题】如何将 pyplot 函数附加到图形实例?【英文标题】:How can I attach a pyplot function to a figure instance? 【发布时间】:2012-12-24 15:09:01 【问题描述】:

以前,我遇到了interference between multiple Matplotlib figures 的问题。最后我发现了一个问题,即一些 pyplot 函数不附加到它们的图形实例,但可以在其他一些并行创建的图形实例中呈现。

下面是一些示例代码:

from django.http import HttpResponse
from numpy import arange, meshgrid
from matplotlib.mlab import bivariate_normal

def show_chart(request):
    delta = 0.025
    x = arange(-3.0, 3.0, delta)
    y = arange(-2.0, 2.0, delta)
    X, Y = meshgrid(x, y)
    Z1 = bivariate_normal(X, Y, 1.0, 1.0, 0.0, 0.0)
    Z2 = bivariate_normal(X, Y, 1.5, 0.5, 1, 1)
    Z = 10.0 * (Z2 - Z1)

    from matplotlib.pyplot import figure, contour
    fig1 = figure(figsize=(4, 4), facecolor='white')
    contour(X, Y, Z)

    response = HttpResponse(content_type='image/png')
    fig1.savefig(response, format='png')
    fig1.clear()
    return response

上面示例中的轮廓 pyplot 函数可以在 fig1 中渲染,但有时也可以在其他并行生成的图中渲染。这很烦人。有没有办法将轮廓pyplot函数附加到fig1?

【问题讨论】:

【参考方案1】:

您可以创建一个子图,然后调用该子图的contour 方法:

fig1 = figure(figsize=(4, 4), facecolor='white')
ax = fig1.add_subplot(111)
ax.contour(X, Y, Z)

plt.subplots 可以方便地通过一次调用创建图形和子图:

import matplotlib.pyplot as plt

fig, ax = plt.subplots()

【讨论】:

这是一个完美的答案:就像一个魅力,只需要我添加三个标志“斧头”。到我的代码库。非常感谢! 谢谢。如果它是“完美的”,你可以考虑给它投票;-)。 感谢您的回答,非常有用。【参考方案2】:

作为对这里发生的事情的一点解释,matplotlib 有两个半独立的接口;状态机和OO接口。

状态机代码设计用于在交互式外壳中工作(并模仿 matlab 的界面)。它通过将 OO 接口包装在一组命令中来实现这一点,这些命令跟踪当前的 figureaxes 是什么。当您使用来自matplotlib.pyplot 的命令(我怀疑您的代码中有from matploblib.pyplot import *)时,或多或少等同于执行gcf().gca().contour(...)。当您创建一个新图形时,它会自动成为当前图形(如果您在迭代 shell 中使用它,这就是您想要的),因此您看到的行为是“正确的”行为。状态机界面也有代码,以确保在需要时重新绘制图形,管理 gui 事件循环等(您需要做的所有事情才能使交互界面顺利运行)。正如 hayden 在 cmets 中提到的,运行 ipython --pylab 会自动运行 from matplotlib.pyplot import *,这为您提供了一个非常漂亮的交互式 shell。

OO 接口设计用于以编程方式处理matplotlib。它增加了冗长的内容(您现在必须完成状态机的大部分工作),它弥补了清晰度。在 OO 模型中,大多数(可能全部)绘图函数与 Axes 对象 (doc) 相关联(因为可以有多个轴与图形相关联(例如 subplots 使用 gridspec)。

解决问题的另一种方法是

ax = fig1.gca()

它将从fig1 中获取当前坐标轴,并在必要时创建一个坐标轴。如果您跟踪您的图形对象,而不是您的轴对象,并且想要向图形添加另一个图形,这可能会有所帮助。

【讨论】:

谢谢你,这帮助我理解了这个问题! 值得注意的是运行ipython --pylab包括from matploblib.pyplot import *

以上是关于如何将 pyplot 函数附加到图形实例?的主要内容,如果未能解决你的问题,请参考以下文章

JClouds:如何将新卷附加到 AWS EC2 实例

Amazon EMR:将 EBS 卷附加到实例时如何确保使用该卷

将 ELB 实例附加到“应用程序负载均衡器”

将每个 seaborn 图形附加到 for 循环内的 PDF

是否可以绘制带有箭头的图形,如 MATLAB 中附加的图像所示?

如何通过kprobe将BPF程序附加到内核函数?