【问题标题】:FiPy viewer logarithmic axes scaling and aspect ratioFiPy 查看器对数轴缩放和纵横比
【发布时间】:2021-03-13 14:21:37
【问题描述】:

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

我还有一个关于查看器纵横比的问题。在Matplotlib2DGridContourViewer 的文档中有一个名为 figaspect 的属性:

figaspect (float, optional) – 想要的图形纵横比。如果是数字,请使用该纵横比。如果是 auto,则纵横比将由 var 的网格确定。

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

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

【问题讨论】:

    标签: python matplotlib fipy


    【解决方案1】:

    Matplotlib2DGridContourViewer 包装了matplotlib contourf(),它似乎没有为日志缩放提供任何直接选项,但是,所有MatplotlibViewer 子类都有一个.axes 属性。您应该可以调用viewer.axes.set_yscale() 来获得日志缩放。

    至于figaspect,您尝试做的具体示例会有所帮助,但我认为我理解。 figaspect 控制 figure 的纵横比。它用于为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 的几何和拓扑结构上的数据。它们都不是为了处理Mesh 非空间维度而设计的。

    【讨论】:

    • 谢谢。根据您的回答,我想我将从 CellVariable 中提取数据并使用 matplotlib 绘制它。我刚开始使用 2D CellVariable,因为这样我的项目开始时的基本绘图似乎更容易。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-04
    • 1970-01-01
    • 2011-08-24
    • 1970-01-01
    相关资源
    最近更新 更多