如何让matplotlib准确地放置线条?

6

默认情况下,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直接并默认进行亚像素级渲染: Mathematica渲染的同一物体 我们为什么不能做到呢?

可能x轴的限制从轴的外侧开始,即从x=1绘制斜率会在x=轴宽度处略微偏移?尝试设置稍小的x低限制,例如ax.set_xlim([0.9999, 3.0001]) - pathoren
将dpi调高。这看起来像是低dpi和像素捕捉问题。 - tacaswell
将下限xlim移动到0.99在视觉上可能有效,但是改变目标是真正的欺骗,并不是一般解决方案。 - user6765044
这个问题显然可以通过使用Cairo解决,参见https://dev59.com/ABf7s4cB2Jgan1zn6Rit。 - roeland
3个回答

3
当绘制关于x轴对称且缓慢逼近0的函数时,问题变得更加明显。例如,在这里:enter image description here。 如果你在科学论文中告诉读者这两条曲线是对称的,那么实际情况非常尴尬!我通过将其导出为pdf而不是导出为png来解决了这个问题:enter image description here

3
考虑以下内容以了解正在发生的事情。
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
我同意我们可以通过制作一个巨大的图像,然后缩小它以进行显示来获得准确的渲染。但这很笨拙、低效和间接。如果Mathematica可以默认进行亚像素完美渲染(请参见我将附加到问题中的图像),为什么我们不能呢?这太尴尬了! - user6765044
1
我发现 snap=False 没有明显的帮助。 - user6765044
1
将近两年过去了,这个问题仍然存在。我无法相信没有人来解决这个问题,因为它是一个绘图模块的主要问题。 - Dunkelkoon

0

我完全同意应该继续研究这个。我发现通过使用 plt.figure 并调用 dpi=144 (默认值为 72),plt.plot 在 Jupyter 中可以得到(至少是大致)未移动的线条。不过图形确实变大了两倍...


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