如何将坐标传递给 arviz / pymc3 函数 plot_posterior(类似于 xarray.Dataset.sel)

How to pass coordinates to arviz / pymc3 function plot_posterior (similar to xarray.Dataset.sel)

我正在 pymc3 中进行一些贝叶斯建模,并想使用 plot_posterior(来自 arviz 包)绘制后验分布。结果图在水平轴上错位了,我想将它移到 -3 和 +3 之间。不幸的是,我不知道应该将什么传递给函数来指定它。

arviz.plot_posterior 的文档指定参数 "coords" 具有定义 "Coordinates of var_names to be plotted. Passed to Dataset.sel" 大概这是我需要指定水平轴范围的内容,但它没有告诉我期望什么样的价值。

我已经检查了 Dataset.sel 的文档,它指出它期望的第一个参数是 "A dict with keys matching dimensions and values given by scalars, slices or arrays of tick labels." 我对此的解释是键是与变量名称匹配的字符串( s) 和值是一些可迭代的刻度线结构。

我的变量名为 'm',由以下代码生成:

with pymc3.Model() as m1:
    m = pymc3.Normal('m', mu = 0, sigma = 1)
    obs = pymc3.Normal('obs', mu = m, sigma = 1, observed = numpy.random.randn(3))
    trace = pymc3.sample(1000, tune = 500, cores = 1)

我对 plot_posterior 的预期是这样的:

plot_posterior(trace, coords = {'m': [-3.0, -2,0, -1,0, 0.0, 1.0, 2.0, 3.0]})

它给了我错误 "ValueError: dimensions or multi-index levels ['m'] do not exist"

大概我是在正确的轨道上,但我无法更准确地定义这个函数需要什么参数。感谢您提供的任何帮助。

编辑:我已经弄清楚了如何自己扩展坐标轴(诀窍是 ax = mpl.pyplot.axes(xlim = (-3.0, 3.0))) 但我仍然不知道如何扩展变量本身的绘图。

这实际上是您可以直接转到 matplotlib 的东西:pm.plot_posterior 将 return 一个轴,它具有大多数显示属性的 getter 和 setter:

ax, = pymc3.plot_posterior(trace)
ax.set_xlim(-3, 3)

coords 参数用于 multi-dimensional 个随机变量。如果您的模型看起来像这样:

with pymc3.Model() as m1:
    m = pymc3.Normal('m', mu = 0, sigma = 1, shape = 4)
    obs = pymc3.Normal('obs', mu = m, sigma = 1, observed = numpy.random.randn(3, 4))
    trace = pymc3.sample(1000, tune = 500, cores = 1)

那么您的图将具有 m:

的所有 4 个维度
pymc3.plot_posterior(trace)

您可以使用 coords 来减少它:

pymc3.plot_posterior(trace, coords={'m_dim_0': [0, 2]})