【问题标题】:imshow in subplot with interactive mode在具有交互模式的子图中显示
【发布时间】:2014-07-02 20:52:33
【问题描述】:

当以下两个条件都为真时,我无法让 matshow() 或 imshow() 实际显示绘图:(1) 交互模式开启:import matplotlib.pyplot as plot; plot.ion(),以及 (2) 我正在尝试使用 matshow on一个特定的子图:fig = plot.figure(); ax = fig.add_subplot(111); ax.matshow([[1,2],[3,0]])

使用plot.matshow([[1,2],[3,0]])(注意:没有明确的轴)可以在交互模式下找到,但总是会创建一个带有单个轴对象的新图形窗口。上面带有子图的代码在没有使用 plot.show() 的交互模式下也可以正常工作,并且会将图像放在正确的轴上。

更奇怪的是,如果我与图形交互,例如通过使用缩放工具并在图形窗口中随机单击,带有子图的上述代码将显示图像(没有可见的轴对象,但我只是单击某处在图形窗口的中间)。

任何想法可能导致此问题,我如何解决它,或者我如何绕过它在指定的子图上使用 matshow 或 imshow(最终用例是在图中有超过 1 个子图)?这发生在 python (2.7.6) 和 ipython (1.1.1) 中

【问题讨论】:

    标签: python matplotlib imshow


    【解决方案1】:

    这可能与本文档有关:

    在新的图形窗口中将数组显示为矩阵。

    但是,您也可以使用带有合适参数的imshow

    import matplotlib.pyplot as plt
    
    plt.imshow(mat, interpolation='nearest', origin='upper', aspect='equal')
    

    这应该做同样的事情,但不那么奇怪。这实际上正是matshow 在内部所做的。它只是为图像添加了一些刻度标记。

    另外,通过查看源代码(或仔细阅读帮助字符串),您可以尝试这样做:

    plt.matshow(mat, fignum=0)
    

    这应该强制它使用当前轴,它通过使用gca 选择。

    除此之外,您还使用了ax.matshow。实际上plt.matshowax.matshow 的一个非常薄的包装,主要用于创建新图像。

    如果您对子图中的matshowimshow 仍有问题,请制作一个最小的完整示例供我们尝试!这是我在交互式 shell (IPython) 中尝试过的东西:

    figure()
    ax = subplot(121)
    ax2 = subplot(122)
    ax.matshow(random.random((20,30)))
    ax2.plot(linspace(-1,1,100), linspace(-1,1,100)**2)
    draw()
    

    (问题可能是缺少draw?)

    我得到了什么:

    【讨论】:

    • 不错。 plt.draw() 做到了。我想我认为这要么被 plt.show() 或 plt.ion() 覆盖。另外,不知何故我错过了文档中的 fignum 参数,这也适用于 plt.matshow() 而不是 ax.matshow()
    猜你喜欢
    • 2019-02-02
    • 1970-01-01
    • 2019-10-12
    • 1970-01-01
    • 1970-01-01
    • 2020-03-23
    • 1970-01-01
    • 2018-05-10
    • 1970-01-01
    相关资源
    最近更新 更多