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

Mei*_*ilo 11 python numpy matplotlib

以前,我遇到了多个Matplotlib数字之间干扰的问题.最后,我跟踪了一个问题,即某些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
Run Code Online (Sandbox Code Playgroud)

上例中的轮廓pyplot函数可以在图1中呈现,但偶尔也可以在并行生成的其他图中呈现.这非常烦人.有没有办法将轮廓pyplot功能附加到fig1?

tac*_*ell 20

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

状态机代码设计用于在交互式shell中工作(并模仿matlab的界面).它通过将OO接口包装在一组跟踪当前figure和当前状态的命令中axes来实现.当你使用命令时matplotlib.pyplot(我怀疑你from matploblib.pyplot import *的代码中有一个)或多或少等同于做gcf().gca().contour(...).当您创建一个新图形时,它会自动变为当前(如果您在迭代shell中使用它,这就是您想要的),因此您看到的行为是"正确"行为.状态机界面中还包含代码,以确保在需要时重新绘制数字,管理gui事件循环等(为了使交互式界面顺利运行,您需要做的所有事情).正如hayden在评论中提到的,运行ipython --pylab将自动运行from matplotlib.pyplot import *,这为您提供了一个非常好的交互式shell.

OO接口专为程序化处理而设计matplotlib.它增加了冗长(你现在必须完成状态机的大部分工作),它清晰地弥补了这一点.在OO模型中,大多数(可能全部)绘图函数与Axes对象(doc)相关联(因为可能有多个轴与图形相关联(使用前子图gridspec).

解决问题的另一种方法是

ax = fig1.gca()
Run Code Online (Sandbox Code Playgroud)

这将抓住当前轴fig1,必要时创建一个.如果您跟踪图形对象而不是轴对象并想要在图中添加另一个图形,这可能会有所帮助.


bmu*_*bmu 12

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

fig1 = figure(figsize=(4, 4), facecolor='white')
ax = fig1.add_subplot(111)
ax.contour(X, Y, Z)
Run Code Online (Sandbox Code Playgroud)

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

import matplotlib.pyplot as plt

fig, ax = plt.subplots()
Run Code Online (Sandbox Code Playgroud)