FiPy 查看器对数轴缩放和纵横比

FiPy viewer logarithmic axes scaling and aspect ratio

有没有一种简单的方法可以让不同的轴按对数比例缩放?我正在使用 Matplotlib2DGridContourViewer 并且我设法使用 fipy.Viewer(vars=somevariable, log=True) 使绘制的数据以对数方式缩放,但我找不到任何关于轴缩放的信息。在我的例子中,我只需要 y 轴对数。

另外,我还有一个关于查看器纵横比的问题。在 Matplotlib2DGridContourViewer 的文档中有一个 属性 叫做 figaspect:

figaspect (float, optional) – desired aspect ratio of figure. If a number, use that aspect ratio. If auto, the aspect ratio will be determined from the vars’s mesh.

我在 Jupyter Notebook 中工作,如果我将所需的数字设置为纵横比,例如0.5 它不会改变轴的长度比,而是改变整个 viewer/figure 区域的纵横比,这意味着数据不会更具可读性,只是查看器区域被绘图纵横比挤压比例不变。我想要更改轴长度比的原因是我有一个带有 1000x1000 个单元格的 2D 网格,并且出于某种原因,默认纵横比不是由它确定的 (1:1),而是来自 [=] 的设置最大坐标13=] 和 mesh.y。这样,如果我想检查 1:100 网格,我会得到一个基本上不可读的非常长的图。 (我明白为什么要这样实现,但我使用 2D 网格来绘制 1D 网格上的时间依赖性,所以时间和 space 坐标甚至都不接近。)

我想我的问题是,有什么方法可以使 figaspect 以我想要的方式工作,或者是否有任何其他相对简单的方法能够设置轴长度的比率?如果我可以将纵横比与网格单元的数量联系起来,那也是可以接受的。

Matplotlib2DGridContourViewer wraps matplotlib contourf() which does not appear to offer any direct option for log scaling, however, all MatplotlibViewer subclasses have an .axes property. You should be able to call viewer.axes.set_yscale() 获取对数缩放。

至于 figaspect,您尝试做的事情的具体示例会有所帮助,但我 认为 我理解。 figaspect 控制 图形 的纵横比。它用于生成 matplotlib figure()figsize= 参数。如果设置 figaspect='auto',FiPy 会尝试设置图形(包括颜色条)的纵横比,以遵守 Mesh 的纵横比。我不知道当您将 figaspect 设置为其他内容时会发生什么 尝试仅查看 Mesh.

的一个子集

当纵横比变得非常大时,Matplotlib2DGridContourViewer 确实没有考虑 Mesh 的纵横比。 Matplotlib2DGridViewer 按预期工作。比较

import fipy as fp
mesh = fp.Grid2D(nx=100, dx=0.5, ny=100, dy=1)
var = fp.CellVariable(mesh=mesh, name=r"$\phi$")
cviewer = fp.Matplotlib2DGridContourViewer(vars=var)
gviewer = fp.Matplotlib2DGridViewer(vars=var)

import fipy as fp
mesh = fp.Grid2D(nx=100, dx=0.01, ny=100, dy=1)
var = fp.CellVariable(mesh=mesh, name=r"$\phi$")
cviewer = fp.Matplotlib2DGridContourViewer(vars=var)
gviewer = fp.Matplotlib2DGridViewer(vars=var)

我不知道这是为什么。我既不使用 Matplotlib2DGridContourViewer 也不在疯狂的宽高比网格上建模。我已经提交了一份 ticket 所以这不会丢失。

最终,我不认为使用 2D CellVariable 存储 1D+时间数据是个好主意。我认为你最好将一维数据提取到一个 numpy 数组中,然后直接使用 matplotlib 来渲染你感兴趣的任何内容。 CellVariableViewer 的全部要点是存储和渲染位于 Mesh 的几何和拓扑结构上的数据。 None 旨在处理 Mesh 非空间维度。