如何在Python下面的标记下面放置行?

时间:2015-05-06 05:47:33

标签: python matplotlib plot

我必须在一个图上绘制多条线和它们的曲线拟合线。所有这些线都使用for循环绘制。由于它是使用循环的绘图,所以后续步骤的曲线拟合线被绘制在其前身上,如图所示。enter image description here

可重现的代码:

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()

它给了我标记下面的所有拟合线。

enter image description here

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

更新

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

回答后更新2

我也能为同一行做这个吗?举个例子:

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

我可以给linestyle一个zorder = 1,标记是zorder = 3吗?

1 个答案:

答案 0 :(得分:1)

仅编辑您的绘图线:

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

现在标记都在线的前面,尽管在标记/线组内它们仍然是绘图顺序。

更新

回答改变的问题(TSK!):没有。一次调用plot,一个zorder参数。

如果要匹配每次循环中标记和线条的颜色和样式,请为颜色设置迭代器或生成器,并在每次传递时获取current_color,然后将其用作{的参数{1}}来电。