如何在 Python 中的标记下方放置线条?

How to place lines below markers in Python?

我必须在单个图上绘制多条线及其曲线拟合线。所有这些线都是使用 for 循环绘制的。由于它是使用循环绘制的,因此后续步骤的曲线拟合线绘制在其前一步上,如图所示。

可重现代码:

import matplotlib.pyplot as plt
import numpy as np

x = np.array([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
             [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]])
y = np.array([[4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24],
             [6, 5.2, 8.5, 9.1, 13.4, 15.1, 16.1, 18.3, 20.4, 22.1, 23.7]])

m, n = x.shape

figure = plt.figure(figsize=(5.15, 5.15))
figure.clf()
plot = plt.subplot(111)
for i in range(m):
    poly = np.polyfit(x[i, :], y[i, :], deg =1)
    plt.plot(poly[0] * x[i, :] + poly[1], linestyle = '-')
    plt.plot(x[i, :], y[i, :], linestyle = '', marker = 'o', markersize = 20)
plot.set_ylabel('Y', labelpad = 6)
plot.set_xlabel('X', labelpad = 6)
plt.show()

我可以使用另一个循环来解决这个问题:

import matplotlib.pyplot as plt
import numpy as np

x = np.array([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
             [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]])
y = np.array([[4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24],
             [6, 5.2, 8.5, 9.1, 13.4, 15.1, 16.1, 18.3, 20.4, 22.1, 23.7]])

m, n = x.shape

figure = plt.figure(figsize=(5.15, 5.15))
figure.clf()
plot = plt.subplot(111)
for i in range(m):
    poly = np.polyfit(x[i, :], y[i, :], deg =1)
    plt.plot(poly[0] * x[i, :] + poly[1], linestyle = '-')
for i in range(m):
    plt.plot(x[i, :], y[i, :], linestyle = '', marker = 'o', markersize = 20)
plot.set_ylabel('Y', labelpad = 6)
plot.set_xlabel('X', labelpad = 6)
plt.show()

这给了我标记下方的所有拟合线。

但是 Python/matplotlib 中是否有任何内置函数可以在不使用两个循环的情况下执行此操作?

更新

仅作为示例,我使用了 n = 2,n 可以大于 2,即循环将 运行 多次。

回答后更新2

我也可以对同一行执行此操作吗?例如:

 plt.plot(x[i, :], y[i, :], linestyle = ':', marker = 'o', markersize = 20)

我可以给线型 zorder = 1 和标记 zorder = 3 吗?

仅编辑您的绘图线:

    plt.plot(poly[0] * x[i, :] + poly[1], linestyle = '-',
             zorder=-1)
    plt.plot(x[i, :], y[i, :], linestyle = '', marker = 'o', markersize = 20,
             zorder=3)

现在标记都在线条的前面,尽管在 marker/line 组中它们仍然是按绘图顺序排列的。

更新答案

没有。一次调用 plot,一个 zorder 参数。

如果您想在每次循环中匹配标记和线条的颜色和样式,请为颜色设置迭代器或生成器并在每次通过时获取 current_color,然后将其用作参数plot 个电话。