【问题标题】:Improper rendering at axes border in MatplotlibMatplotlib 中轴边界的渲染不正确
【发布时间】:2024-01-16 02:49:01
【问题描述】:

我想在 matplotlib 的轴内渲染一个矩形。坐标轴是原点在左下角的单位正方形。对于矩形与轴的大小相同的情况 - 我希望矩形看起来好像它是轴的边框。

问题是渲染似乎不正确。矩形的左侧 (x=0) 和顶部 (y=1) 被渲染,但底部 (y=0) 和右侧 (x=1) 不显示。

注意:这不仅仅适用于矩形......它也适用于线条。生成的渲染显示为:

下面的代码sn-p演示了这个问题:

import matplotlib.pyplot as mpl

r = mpl.Rectangle((0,0), 1, 1, edgecolor='red', facecolor='none', zorder=100)

axes = mpl.gca()
axes.add_patch(r)
axes.set_xbound(0, 1)
axes.set_ybound(0, 1)

axes.get_xaxis().set_visible(False)
axes.get_yaxis().set_visible(False)

[spine.set_visible(False) for spine in axes.spines.values()]

mpl.show()

我还渲染了 PDF 并验证了它可以正常工作(例如,当所有边都放大时)。

这似乎与底层图像如何光栅化到屏幕有关。有没有办法解决这个问题?

【问题讨论】:

    标签: python matplotlib plot wxpython rendering


    【解决方案1】:

    确切的行为取决于后端(您的示例在我的系统上按您的意愿工作。)

    但是,如果您为矩形关闭剪裁,它应该在任何后端都按照您的意愿行事。

    在上面的示例中,只需执行r.set_clip_on(False)

    import matplotlib.pyplot as plt
    
    r = plt.Rectangle((0,0), 1, 1, edgecolor='red', facecolor='none', zorder=100)
    
    ax = plt.gca()
    ax.add_patch(r)
    ax.axis([0, 1, 0, 1])
    
    ax.xaxis.set_visible(False)
    ax.yaxis.set_visible(False)
    
    [spine.set_visible(False) for spine in ax.spines.values()]
    
    r.set_clip_on(False)
    
    plt.show()
    

    【讨论】:

    • 谢谢乔。您的解决方案很有意义并解决了我的问题。但这确实引出了另外两个问题。这是我后端的错误吗?似乎是。其次,剪裁开或关有什么区别?剪裁对于绘图的效率会降低吗?我只是问,因为我做了很多动画。
    • @Rocketman - 我不确定这是否是一个错误。你可以在用户列表上提问,可能会得到比我给你更好的答案。至于第二个:我不认为(??)剪辑会在简单的情况下过多地影响动画的速度。 (如果你还没有使用 blitting。matplotlib 页面上有几个教程。)
    最近更新 更多