
我正在使用一个for循环,并试图找出如何使用图例一次,无论是在上面或下面的子图。
import matplotlib.pyplot as plt
import numpy as np
plot_loc = 1
total_t = 0.1
dt = [1e-4, 1e-3, 1.5e-3]
for n in dt:
#
#
#
t, y_explicit = explicit_euler(total_t, n)
t, y_implicit = implicit_euler(total_t, n)
y_analytical = analytical(total_t,n)
plt.subplot(3,1,plot_loc)
plt.plot(t, y_explicit, color = 'blue')
plt.plot(t, y_implicit, color = 'black')
plt.plot(t,y_analytical,linestyle='dashed',color = 'orange')
plt.legend(['Explicit','Implicit','Analytical'])
plot_loc+=1
plt.tight_layout(pad=1.0)
plt.show()如果您只想在最后一个子图上使用图例,那么只需将
plt.legend移出循环。
在这种情况下,它将它绘制在第三个子图中(请参见下面的结果),这是我不需要的。我要它要么在第一个子图,下面的情节或在标题。

发布于 2022-10-11 02:51:49
正如Mikael所建议的,您应该首先将图例代码行移到for循环之外。然后,使用bbox_to_anchor()设置图例的位置。
当您使用plt.plot()绘制每个子图时,一旦您完成了循环,所引用的图将是最后一个。因此,坐标将相对于最后一个子图。我用-0.25来设置高度,使图低于最后一个子图。一定要调整这个,以确保传奇出现在你想要的地方。
另外,请注意,您可以使用ncols=3在3列中显示图例,以使情节看起来更好。如果它不适合你的要求,你可以把它移除。下面给出了更新的代码(带有随机数据)和图例行。希望这就是你要找的..。
import matplotlib.pyplot as plt
import numpy as np
plot_loc = 1
total_t = 0.1
dt = [1e-4, 1e-3, 1.5e-3]
t=np.linspace(0,0.1,101)
for n in dt:
# t, y_explicit = explicit_euler(total_t, n)
# t, y_implicit = implicit_euler(total_t, n)
# y_analytical = analytical(total_t,n)
y_explicit = np.random.uniform(low=-0.001, high=0, size=(101,))
y_implicit = np.random.uniform(low=-0.001, high=0, size=(101,))
y_analytical = np.random.uniform(low=-0.001, high=0, size=(101,))
plt.subplot(3,1,plot_loc)
plt.plot(t, y_explicit, color = 'blue')
plt.plot(t, y_implicit, color = 'black')
plt.plot(t,y_analytical,linestyle='dashed',color = 'orange')
plot_loc+=1
plt.legend(['Explicit','Implicit','Analytical'], bbox_to_anchor=(0.85, -0.25), ncol=3)
plt.tight_layout(pad=1.0)
plt.show()图

https://stackoverflow.com/questions/74021364
复制相似问题