我该如何请教matplotlib轻微移动重叠的曲线以避免彼此隐藏?

6

我正在使用matplotlib.pyplot在同一张图中绘制多个曲线。有时候它们具有相同的数值,这样最后一个会遮盖其他的,就像这样:

import matplotlib.pyplot as plt
plt.figure()
plt.plot([1,2,3,4], label="up")
plt.plot([1,2,3,2.5], label="down")
plt.show()

隐藏的曲线

我希望将这些曲线稍微移动一下,使它们不会彼此遮挡,就像这样:

所有曲线可见

有没有适当的方法可以实现这一点,而无需更改我正在绘制的实际值?

更新: 到目前为止(对于我的情况),最好的答案是theImportanceOfBeingErnest。 然而,如果我有n条曲线要绘制,而不仅仅是2条,我将不得不为每条曲线计算累积偏移量。但是,考虑到这个答案所涉及的复杂计算,我想matplotlib没有自动执行这项工作的方式?

PS: 由于我的所有值都是0.5的倍数,因此(轻微的)移位不会对实际价值造成混淆......

5个回答

5

我认为翻译一个以点为单位的艺术家的常规方法是使用matplotlib.transforms.offset_copy。由于线条的默认线宽为1.5个点,因此需要将曲线平移大约该数字。

import matplotlib.pyplot as plt
import matplotlib.transforms as mtrans

fig, ax = plt.subplots()
ax.plot([1,2,3,4], label="up")

tr = mtrans.offset_copy(ax.transData, fig=fig, x=0.0, y=-1.5, units='points')
ax.plot([1,2,3,2.5], label="down", transform=tr)

plt.show()

enter image description here

请注意,这种方法在线条分散且没有太多上下波动的情况下效果很好。更复杂的解决方案(但也更加复杂)可以在Matplotlib中如何绘制多彩的线条,例如彩虹中找到。

关于编辑:我想“计算偏移量”实际上意味着 i*(-1.5),这很容易吧? - ImportanceOfBeingErnest
是的,那就是我的意思,而且很容易实现。我只是希望有一种参数或内置函数能够自动防止曲线互相遮挡,但我想那是不可能的... - Ariane

3
你可以使用alpha属性来实现。最初的回答中提到了这一点。
import matplotlib.pyplot as plt
plt.figure()
plt.plot([1,2,3,4], label="up")
plt.plot([1,2,3,2.5], label="down", alpha=.3)
plt.legend()
plt.show()

通过调整[0, 1]之间的比率,以获得所需的最佳方式。这样,您就不必更改自己的价值观。

为了提高可见性,您可以使用“alpha”添加一个“linewidth”属性。例如:


import matplotlib.pyplot as plt
plt.figure()
plt.plot([1,2,3,4], label="up")
plt.plot([1,2,3,2.5], label="down", linewidth=4, alpha=.5)
plt.legend()
plt.show()

最初的回答:更改数值以符合您的需求。

请按照您的喜好更改数值。


1
我会使用一个“transform”将第二个图中的点向下移动一点(您也可以将其应用于第一个图以将点向上移动):
import matplotlib.pyplot as plt
from matplotlib import transforms

fig, ax = plt.subplots()

transform = transforms.Affine2D().translate(0, -0.03) + ax.transData

ax.plot([1, 2, 3, 4], label="up")
ax.plot([1, 2, 3, 2.5], label="down", transform=transform)

enter image description here


这与此答案基本相同,只是将所有内容都转换为数据坐标。这样做的缺点是,您无法在不需要重新调整数字“-0.03”的情况下缩放或缩小绘图。 - ImportanceOfBeingErnest

0

您可以简单地缩放这些值

import matplotlib.pyplot as plt
plt.figure()
plt.plot([1,2,3,4], label="up")
plt.plot([x-0.02 for x in [1,2,3,2.5]], label="down")
plt.legend()
plt.show()

output


0

另一个选择是使用重叠的深色虚线。

import matplotlib.pyplot as plt
plt.figure()
plt.plot([1,2,3,4], color="red", label="up", lw=2)
plt.plot([1,2,3,2.5], color="black", linestyle=":", label="down", lw=2)

enter image description here


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