9

在 matplotlib 中绘制小​​块对象时,由于显示分辨率而引入了伪影。使用抗锯齿并不能解决问题。

这个问题有解决方案吗?

import matplotlib.pyplot as plt
import matplotlib.patches as patches

ax = plt.axes()

for x in range(-10,11):
    for y in range(-10,11):
        rect = patches.Rectangle((x, y), width=0.1, height=0.1, color='k',aa=True)
        ax.add_patch(rect)

plt.xlim([-30, 30])
plt.ylim([-30, 30])
plt.show()

输出

4

1 回答 1

6

感谢您整理了一个简单的问题示例 - 它确实使调查变得更加容易!

这个问题有解决方案吗?

是的,事实证明有!通过查看您附加的图像,我最初的猜测是发生了一些奇怪的剪辑/捕捉。在排除了抗锯齿的可能性(通过轻弹您提供的开关)后,我唯一的其他测试途径是将“snap”关键字设置为 false(有关 snap 方法的非常有限的文档,请参见http://matplotlib.org/ api/artist_api.html#matplotlib.artist.Artist.set_snap)。

设置快照可以解决问题,您最终会得到预期的结果:

import matplotlib.pyplot as plt
import matplotlib.patches as patches

ax = plt.axes()

for x in range(-10,11):
    for y in range(-10,11):
        rect = patches.Rectangle((x, y), width=0.1, height=0.1, 
                                 color='k', snap=False)
        ax.add_patch(rect)

plt.xlim([-30, 30])
plt.ylim([-30, 30])
plt.show()

视觉比较(最好在新窗口中打开图像,因为您的浏览器可能会缩放图像并引入进一步的视觉效果):

snap属性比较

我对 mpl 中的 snap 属性以及这是否真的是可取的行为并不是特别了解,所以我将在 mpl-devel 邮件列表上发布一个问题来开启关于这个问题的对话。希望这个答案在此期间对您有所帮助。

于 2012-12-12T13:27:07.600 回答