如何在 matplotlib 的子图下方添加图例?
How to add legend below subplots in matplotlib?
我正在尝试在 3 列子图下方添加图例。
我试过以下方法:
fig, ax = plt.subplots(ncols=3)
ax[0].plot(data1)
ax[1].plot(data2)
ax[2].plot(data3)
ax_sub = plt.subplot(111)
box = ax_sub.get_position()
ax_sub.set_position([box.x0, box.y0 + box.height * 0.1,box.width, box.height * 0.9])
ax_sub.legend(['A', 'B', 'C'],loc='upper center', bbox_to_anchor=(0.5, -0.3),fancybox=False, shadow=False, ncol=3)
plt.show()
但是,这只会创建一个空帧。当我注释掉 ax_sub 部分时,我的子图显示得很好(但没有图例...)...
非常感谢!
这与How to put the legend out of the plot
密切相关
图例需要知道它应该显示什么。默认情况下,它将从创建它的轴中获取带标签的艺术家。由于此处轴 ax_sub
为空,因此图例也将为空。
使用 ax_sub
可能无论如何都没有太大意义。我们可以改为使用中间轴 (ax[1]
) 来放置图例。但是,我们仍然需要所有应该出现在传说中的艺术家。对于线条,这很容易;一个人会提供一个行列表作为 handles
参数的句柄。
import matplotlib.pyplot as plt
import numpy as np
data1,data2,data3 = np.random.randn(3,12)
fig, ax = plt.subplots(ncols=3)
l1, = ax[0].plot(data1)
l2, = ax[1].plot(data2)
l3, = ax[2].plot(data3)
fig.subplots_adjust(bottom=0.3, wspace=0.33)
ax[1].legend(handles = [l1,l2,l3] , labels=['A', 'B', 'C'],loc='upper center',
bbox_to_anchor=(0.5, -0.2),fancybox=False, shadow=False, ncol=3)
plt.show()
我正在尝试在 3 列子图下方添加图例。
我试过以下方法:
fig, ax = plt.subplots(ncols=3)
ax[0].plot(data1)
ax[1].plot(data2)
ax[2].plot(data3)
ax_sub = plt.subplot(111)
box = ax_sub.get_position()
ax_sub.set_position([box.x0, box.y0 + box.height * 0.1,box.width, box.height * 0.9])
ax_sub.legend(['A', 'B', 'C'],loc='upper center', bbox_to_anchor=(0.5, -0.3),fancybox=False, shadow=False, ncol=3)
plt.show()
但是,这只会创建一个空帧。当我注释掉 ax_sub 部分时,我的子图显示得很好(但没有图例...)...
非常感谢!
这与How to put the legend out of the plot
密切相关图例需要知道它应该显示什么。默认情况下,它将从创建它的轴中获取带标签的艺术家。由于此处轴 ax_sub
为空,因此图例也将为空。
使用 ax_sub
可能无论如何都没有太大意义。我们可以改为使用中间轴 (ax[1]
) 来放置图例。但是,我们仍然需要所有应该出现在传说中的艺术家。对于线条,这很容易;一个人会提供一个行列表作为 handles
参数的句柄。
import matplotlib.pyplot as plt
import numpy as np
data1,data2,data3 = np.random.randn(3,12)
fig, ax = plt.subplots(ncols=3)
l1, = ax[0].plot(data1)
l2, = ax[1].plot(data2)
l3, = ax[2].plot(data3)
fig.subplots_adjust(bottom=0.3, wspace=0.33)
ax[1].legend(handles = [l1,l2,l3] , labels=['A', 'B', 'C'],loc='upper center',
bbox_to_anchor=(0.5, -0.2),fancybox=False, shadow=False, ncol=3)
plt.show()