如何让matplotlib准确放置线条?

时间:2016-08-27 17:04:29

标签: python matplotlib

默认情况下,matplotlib图可能会非常不准确地放置行。

例如,请参阅附加图中左端点的位置。至少有一整个像素的空气不应该存在。事实上,我认为线条中心偏离了2个像素。

如何让matplotlib准确地绘制 ?如果有一些性能受到影响,我不介意。

matplotlib图中不准确的渲染线:

inaccurately rendered line in matplotlib plot

matplotlib图中不准确的渲染线 - 放大细节:

inaccurately rendered line in matplotlib plot - detail magnified

这是使用Ubuntu 16.04(Python 3),Jupyter笔记本(类似于命令行的结果)中的默认安装。

为了比较,Mathematica直接进行亚像素完美渲染,默认情况下: Same thing rendered by Mathematica 为什么我们不能?

3 个答案:

答案 0 :(得分:2)

请考虑以下内容以了解正在进行的操作

import matplotlib.pyplot as plt

fig, ax = plt.subplots()
ax.plot([1, 2, 3], [4, 5, 4], clip_on=False, lw=5, alpha=.5)
ax.set_xlim([1, 3])

fig.savefig('so.png', dpi=400)

example

你也可以通过将snap=False传递给plot来禁用像素捕捉,但是一旦你开始放置〜单像素宽线,你就会遇到问题,因为基础光栅化过于粗糙。

答案 1 :(得分:1)

当一个绘制相对于x轴对称且慢慢接近零的函数时,问题就更加臭名昭着了。例如:enter image description here

如果你告诉读者科学论文这两条曲线是对称的,那确实很尴尬!

我通过导出到pdf而不是导出到png来解决这个问题:

enter image description here

答案 2 :(得分:0)

我完全同意应对此进行处理。我发现plt.plot通过用plt.figure调用dpi=144(默认值为72)来提供(至少或更少)未移位的行(在Jupyter中)。数字确实变大了两倍……