我正在使用matplotlib绘制子图,并且图例中没有显示图例。 在此示例中,散点图图例未显示。
import numpy as np
import matplotlib
from matplotlib import pyplot as plt
from matplotlib.legend_handler import HandlerLine2D
from matplotlib.patches import Rectangle, Circle
fig = plt.figure()
plt.cla()
plt.clf()
x = np.arange(5) + 1
y = np.full(5, 10)
fig, subplots = plt.subplots(2, sharex=False, sharey=False)
subplots[0].bar(x, y, color='r', alpha=0.5, label='a')
scat = subplots[0].scatter(x, y-1, color='g', label='c')
subplots[0].set_yscale('log')
subplots[1].bar(x, y, color='r', alpha=0.5, label='a')
x = [2, 3]
y = [4, 4]
subplots[1].bar(x, y, color='b', alpha=1, label='b')
subplots[1].set_yscale('log')
plt.legend(loc='center left', bbox_to_anchor=(1, 0.5), handler_map={scat: HandlerLine2D(numpoints=4)})
plt.show()
以下是我尝试的解决方法:
p1 = Rectangle((0, 0), 1, 1, fc="r", alpha=0.5)
p2 = Rectangle((0, 0), 1, 1, fc="b")
p3 = Circle((0, 0), 1, fc="g")
legend([p1, p2, p3], ['a', 'b', 'c'], loc='center left', bbox_to_anchor=(1, 0.5))
我真的更喜欢在没有解决方法的情况下解决这个问题,所以如果有人知道如何修复它,请告诉我。 此外,解决方法的一个问题是Circle对象仍然在图例上显示为条形。
答案 0 :(得分:0)
plt.legend
以gca()
(返回当前轴)开头:
# from pyplot.py:
def legend(*args, **kwargs):
ret = gca().legend(*args, **kwargs)
因此,调用plt.legend
只会让您获得最后一个子图上的图例。但是也可以调用例如ax.legend()
,或您的subplots[0].legend()
。将其添加到代码的末尾为我提供了两个子图的图例。
样品:
for subplot in subplots:
subplot.legend(loc='center left', bbox_to_anchor=(1, 0.5))