将 PyMC3 traceplot 子图保存到图像文件
save PyMC3 traceplot subplots to image file
我正在尝试非常简单地将 PyMC3 traceplot 函数(参见 here)生成的子图绘制到一个文件中。
该函数生成 numpy.ndarray (2d) 个子图。
我需要将这些子图移动或复制到 matplotlib.figure 中以保存图像文件。我能找到的所有内容都显示了如何生成图形的子图首先,然后构建它们。
作为一个最小示例,我从 Here 中提取了示例 PyMC3 代码,并向其中添加了几行以尝试处理子图。
from pymc3 import *
import theano.tensor as tt
from theano import as_op
from numpy import arange, array, empty
### Added these three lines relative to source #######################
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
__all__ = ['disasters_data', 'switchpoint', 'early_mean', 'late_mean', 'rate', 'disasters']
# Time series of recorded coal mining disasters in the UK from 1851 to 1962
disasters_data = array([4, 5, 4, 0, 1, 4, 3, 4, 0, 6, 3, 3, 4, 0, 2, 6,
3, 3, 5, 4, 5, 3, 1, 4, 4, 1, 5, 5, 3, 4, 2, 5,
2, 2, 3, 4, 2, 1, 3, 2, 2, 1, 1, 1, 1, 3, 0, 0,
1, 0, 1, 1, 0, 0, 3, 1, 0, 3, 2, 2, 0, 1, 1, 1,
0, 1, 0, 1, 0, 0, 0, 2, 1, 0, 0, 0, 1, 1, 0, 2,
3, 3, 1, 1, 2, 1, 1, 1, 1, 2, 4, 2, 0, 0, 1, 4,
0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1])
years = len(disasters_data)
@as_op(itypes=[tt.lscalar, tt.dscalar, tt.dscalar], otypes=[tt.dvector])
def rateFunc(switchpoint, early_mean, late_mean):
out = empty(years)
out[:switchpoint] = early_mean
out[switchpoint:] = late_mean
return out
with Model() as model:
# Prior for distribution of switchpoint location
switchpoint = DiscreteUniform('switchpoint', lower=0, upper=years)
# Priors for pre- and post-switch mean number of disasters
early_mean = Exponential('early_mean', lam=1.)
late_mean = Exponential('late_mean', lam=1.)
# Allocate appropriate Poisson rates to years before and after current switchpoint location
rate = rateFunc(switchpoint, early_mean, late_mean)
# Data likelihood
disasters = Poisson('disasters', rate, observed=disasters_data)
# Initial values for stochastic nodes
start = {'early_mean': 2., 'late_mean': 3.}
# Use slice sampler for means
step1 = Slice([early_mean, late_mean])
# Use Metropolis for switchpoint, since it accomodates discrete variables
step2 = Metropolis([switchpoint])
# njobs>1 works only with most recent (mid August 2014) Thenao version:
# https://github.com/Theano/Theano/pull/2021
tr = sample(1000, tune=500, start=start, step=[step1, step2], njobs=1)
### gnashing of teeth starts here ################################
fig, axarr = plt.subplots(3,2)
# This gives a KeyError
# axarr = traceplot(tr, axarr)
# This finishes without error
trarr = traceplot(tr)
# doesn't work
# axarr[0, 0] = trarr[0, 0]
fig.savefig("disaster.png")
我尝试了 subplot() 和 add_subplot() 行的一些变体,但无济于事——所有错误都指向一个事实,即必须首先为图形创建空子图,而不是分配给预先存在的子图。
一个不同的例子(参见 here,大约 80%,从
开始
### Mysterious code to be explained in Chapter 3.
) 完全避免了实用程序并手动构建子图,所以也许对此没有好的答案? pymc3.traceplot 输出确实是无法使用的孤立的子图 ndarray 吗?
你能打印出 type(trarr[0,0])
和 post 结果吗?
首先,matplotlib 坐标轴对象是图形的一部分,只能存在于图形内部。因此,不可能简单地取一个轴并将其放到不同的图形中。但是,在您的情况下 可能 是 fig.add_axes(trarr[0,0])
仍然有效。我对此表示怀疑,但您仍然可以尝试。
除此之外,traceplot()
有一个名为 ax
的关键字参数。
ax : axes
Matplotlib axes. Defaults to None.
虽然还不清楚如何将多个子图指定为一个轴对象,但您仍然可以尝试使用它。尝试将单个轴放入或您自己创建的子图轴数组 axarr
或仅其中的一部分。
编辑,只是没人监督评论里的小行:
根据 bug report 中的回答,据报道 traceplot(tr, ax = axarr)
确实可以正常工作。
我运行陷入同样的问题。我正在使用 pymc3
3.5 和 matplotlib
2.1.2.
我意识到可以通过以下方式导出跟踪图:
trarr = traceplot(tr)
fig = plt.gcf() # to get the current figure...
fig.savefig("disaster.png") # and save it directly
我正在尝试非常简单地将 PyMC3 traceplot 函数(参见 here)生成的子图绘制到一个文件中。
该函数生成 numpy.ndarray (2d) 个子图。
我需要将这些子图移动或复制到 matplotlib.figure 中以保存图像文件。我能找到的所有内容都显示了如何生成图形的子图首先,然后构建它们。
作为一个最小示例,我从 Here 中提取了示例 PyMC3 代码,并向其中添加了几行以尝试处理子图。
from pymc3 import *
import theano.tensor as tt
from theano import as_op
from numpy import arange, array, empty
### Added these three lines relative to source #######################
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
__all__ = ['disasters_data', 'switchpoint', 'early_mean', 'late_mean', 'rate', 'disasters']
# Time series of recorded coal mining disasters in the UK from 1851 to 1962
disasters_data = array([4, 5, 4, 0, 1, 4, 3, 4, 0, 6, 3, 3, 4, 0, 2, 6,
3, 3, 5, 4, 5, 3, 1, 4, 4, 1, 5, 5, 3, 4, 2, 5,
2, 2, 3, 4, 2, 1, 3, 2, 2, 1, 1, 1, 1, 3, 0, 0,
1, 0, 1, 1, 0, 0, 3, 1, 0, 3, 2, 2, 0, 1, 1, 1,
0, 1, 0, 1, 0, 0, 0, 2, 1, 0, 0, 0, 1, 1, 0, 2,
3, 3, 1, 1, 2, 1, 1, 1, 1, 2, 4, 2, 0, 0, 1, 4,
0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1])
years = len(disasters_data)
@as_op(itypes=[tt.lscalar, tt.dscalar, tt.dscalar], otypes=[tt.dvector])
def rateFunc(switchpoint, early_mean, late_mean):
out = empty(years)
out[:switchpoint] = early_mean
out[switchpoint:] = late_mean
return out
with Model() as model:
# Prior for distribution of switchpoint location
switchpoint = DiscreteUniform('switchpoint', lower=0, upper=years)
# Priors for pre- and post-switch mean number of disasters
early_mean = Exponential('early_mean', lam=1.)
late_mean = Exponential('late_mean', lam=1.)
# Allocate appropriate Poisson rates to years before and after current switchpoint location
rate = rateFunc(switchpoint, early_mean, late_mean)
# Data likelihood
disasters = Poisson('disasters', rate, observed=disasters_data)
# Initial values for stochastic nodes
start = {'early_mean': 2., 'late_mean': 3.}
# Use slice sampler for means
step1 = Slice([early_mean, late_mean])
# Use Metropolis for switchpoint, since it accomodates discrete variables
step2 = Metropolis([switchpoint])
# njobs>1 works only with most recent (mid August 2014) Thenao version:
# https://github.com/Theano/Theano/pull/2021
tr = sample(1000, tune=500, start=start, step=[step1, step2], njobs=1)
### gnashing of teeth starts here ################################
fig, axarr = plt.subplots(3,2)
# This gives a KeyError
# axarr = traceplot(tr, axarr)
# This finishes without error
trarr = traceplot(tr)
# doesn't work
# axarr[0, 0] = trarr[0, 0]
fig.savefig("disaster.png")
我尝试了 subplot() 和 add_subplot() 行的一些变体,但无济于事——所有错误都指向一个事实,即必须首先为图形创建空子图,而不是分配给预先存在的子图。
一个不同的例子(参见 here,大约 80%,从
开始### Mysterious code to be explained in Chapter 3.
) 完全避免了实用程序并手动构建子图,所以也许对此没有好的答案? pymc3.traceplot 输出确实是无法使用的孤立的子图 ndarray 吗?
你能打印出 type(trarr[0,0])
和 post 结果吗?
首先,matplotlib 坐标轴对象是图形的一部分,只能存在于图形内部。因此,不可能简单地取一个轴并将其放到不同的图形中。但是,在您的情况下 可能 是 fig.add_axes(trarr[0,0])
仍然有效。我对此表示怀疑,但您仍然可以尝试。
除此之外,traceplot()
有一个名为 ax
的关键字参数。
ax : axes Matplotlib axes. Defaults to None.
虽然还不清楚如何将多个子图指定为一个轴对象,但您仍然可以尝试使用它。尝试将单个轴放入或您自己创建的子图轴数组 axarr
或仅其中的一部分。
编辑,只是没人监督评论里的小行:
根据 bug report 中的回答,据报道 traceplot(tr, ax = axarr)
确实可以正常工作。
我运行陷入同样的问题。我正在使用 pymc3
3.5 和 matplotlib
2.1.2.
我意识到可以通过以下方式导出跟踪图:
trarr = traceplot(tr)
fig = plt.gcf() # to get the current figure...
fig.savefig("disaster.png") # and save it directly