我必须在一个图上绘制多条线和它们的曲线拟合线。所有这些线都使用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)
我可以给linestyle一个zorder = 1,标记是zorder = 3吗?
答案 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}}来电。