如何将一个pyplot函数附加到一个graphics实例?
以前,我遇到了多个Matplotlib数字之间的干扰问题。 最后,我跟踪了一个问题,即一些pyplot函数不附加到他们的graphics实例,但可以在一些其他graphics实例中并行创build。
以下是一些示例代码:
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函数可以在图1中得到渲染,但偶尔也可以在并行生成的其他graphics中渲染。 这非常烦人。 有没有办法将轮廓pyplot函数附加到fig1?
您可以创build一个子图并且调用子图的contour
方法:
fig1 = figure(figsize=(4, 4), facecolor='white') ax = fig1.add_subplot(111) ax.contour(X, Y, Z)
plt.subplots
可以方便地创build一个graphics和子图,只需一个调用:
import matplotlib.pyplot as plt fig, ax = plt.subplots()
作为对这里发生了什么的一点解释, matplotlib
有两个半独立的接口; 状态机和OO接口。
状态机代码是为了在交互式shell中工作而devise的(并且模仿matlab的接口)。 这是通过将OO接口包装在一组命令中来实现的,这些命令跟踪当前的figure
和axes
。 当你使用matplotlib.pyplot
命令(我怀疑你的代码中有一个from matploblib.pyplot import *
)与gcf().gca().contour(...)
或多或less相当。 当你创build一个新的graphics时,它会自动变成当前的(如果你在一个迭代壳体中使用这个graphics,这就是你想要的),所以你看到的行为是“正确的”行为。 状态机接口还有代码,以确保数字在需要时被重新绘制,pipe理GUI事件循环等(为了使交互式界面工作顺利,您需要做的所有事情)。 正如hayden在评论中提到的那样,运行ipython --pylab
会自动from matplotlib.pyplot import *
运行,这会给你一个非常好的交互式shell。
OO接口是为matplotlib
编程处理而devise的。 它增加了详细的内容(你现在必须完成状态机的大部分工作),为了清晰起见, 在OO模型中,大多数(也许是所有)绘图函数都与Axes
对象( doc )相关联(因为可以有多个与graphics相关联的轴(如使用gridspec
子图 )。
解决您的问题的另一种方法是
ax = fig1.gca()
它将从fig1
抓取当前轴,如果需要的话创build一个。 如果你跟踪你的graphics对象,而不是你的坐标轴对象,并且想要向graphics添加另一个graphics,这可能会有所帮助。