Matplotlib中坐标轴边框渲染不当

3
我想在Matplotlib中的坐标轴内渲染一个矩形。该坐标轴是以左下角为原点的单位正方形。如果矩形与坐标轴大小相同,则希望矩形看起来像是坐标轴的边框。
问题在于它似乎渲染不正确。矩形的左侧(x=0)和顶部(y=1)会被渲染,但底部(y=0)和右侧(x=1)不会显示出来。
注意:这不仅针对矩形,对于线条也是如此。渲染结果如下图所示:
以下代码演示了该问题:
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并验证了其正确性(例如,当放大时,所有边缘都存在)。

这似乎与底层图像如何被光栅化到屏幕上有关。有没有解决此问题的方法?

1个回答

3

具体的行为取决于后端(在我的系统上,您的示例按照您所希望的方式运行)。

然而,如果您关闭矩形的剪辑功能,它应该在任何后端上都能按照您所期望的方式运行。

在您上面的示例中,只需执行 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()

enter image description here


谢谢Joe。你的解决方案很有道理,也解决了我的问题。但这引出了另外两个问题。这是不是我的后端代码中的一个bug?看起来是的。其次,剪辑开或关有什么区别?关闭剪辑在绘制时会稍微低效吗?我之所以问,是因为我正在进行大量动画处理。 - Rocketman
@Rocketman - 我不确定这是否是一个bug。你可以在用户列表上询问,可能会得到比我更好的答案。至于第二个问题:我认为在简单情况下裁剪不会对动画速度产生太大影响。(如果还没有使用blitting,请使用它。matplotlib页面上有几篇教程可供参考。) - Joe Kington

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接